rails new inner ejemplos active ruby-on-rails activerecord ruby-on-rails-2

ruby-on-rails - new - ruby rails active record



Fecha de Rails ActiveRecord entre (11)

Necesito consultar los comentarios hechos en un día. El campo es parte de las marcas de tiempo estándar, es created_at. La fecha seleccionada proviene de un date_select. ¿Cómo puedo usar ActiveRecord para hacer eso?

Necesito algo así como:

"SELECT * FROM comments WHERE created_at BETWEEN ''2010-02-03 00:00:00'' AND ''2010-02-03 23:59:59''"


Debería haber un comportamiento de registro activo predeterminado en esto. Consultar fechas es difícil, especialmente cuando se trata de zonas horarias.

De todos modos, uso:

scope :between, ->(start_date=nil, end_date=nil) { if start_date && end_date where("#{self.table_name}.created_at BETWEEN :start AND :end", start: start_date.beginning_of_day, end: end_date.end_of_day) elsif start_date where("#{self.table_name}.created_at >= ?", start_date.beginning_of_day) elsif end_date where("#{self.table_name}.created_at <= ?", end_date.end_of_day) else all end }


Ejecuté este código para ver si la respuesta comprobada funcionaba, y tuve que intentar intercambiar las fechas para hacerlo bien. Esto funcionó--

Day.where(:reference_date => 3.months.ago..Time.now).count #=> 721

Si está pensando que la salida debería haber sido 36, considere esto, señor, ¿cuántos días son 3 días para 3 personas?


Este código debería funcionar para usted:

Comment.find(:all, :conditions => {:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day})

Para obtener más información, eche un vistazo a los cálculos de tiempo

Nota: Este código está en deprecated . Usa el código de la respuesta si estás usando Rails 3.1 / 3.2


He estado usando los 3 puntos, en lugar de 2. Tres puntos te dan un rango que está abierto al principio y cerrado al final, por lo que si haces 2 consultas para rangos posteriores, no puedes volver a obtener la misma fila ambos.

2.2.2 :003 > Comment.where(updated_at: 2.days.ago.beginning_of_day..1.day.ago.beginning_of_day) Comment Load (0.3ms) SELECT "comments".* FROM "comments" WHERE ("comments"."updated_at" BETWEEN ''2015-07-12 00:00:00.000000'' AND ''2015-07-13 00:00:00.000000'') => #<ActiveRecord::Relation []> 2.2.2 :004 > Comment.where(updated_at: 2.days.ago.beginning_of_day...1.day.ago.beginning_of_day) Comment Load (0.3ms) SELECT "comments".* FROM "comments" WHERE ("comments"."updated_at" >= ''2015-07-12 00:00:00.000000'' AND "comments"."updated_at" < ''2015-07-13 00:00:00.000000'') => #<ActiveRecord::Relation []>

Y, sí, siempre es bueno usar un alcance.


Puede usar debajo de la gema para encontrar los registros entre las fechas,

Esta gema es bastante fácil de usar y más clara Por la estrella estoy usando esta gema y la API más clara y la documentación también está bien explicada.

Post.between_times(Time.zone.now - 3.hours, # all posts in last 3 hours Time.zone.now)

Aquí puede pasar nuestro campo también Post.by_month("January", field: :updated_at)

Por favor mira la documentación y pruébalo.


Rails 5.1 introdujo un nuevo método de ayuda de fecha all_day , consulte: https://github.com/rails/rails/pull/24930

>> Date.today.all_day => Wed, 26 Jul 2017 00:00:00 UTC +00:00..Wed, 26 Jul 2017 23:59:59 UTC +00:00

Si está utilizando Rails 5.1, la consulta se vería así:

Comment.where(created_at: @selected_date.all_day)


Si solo quieres obtener un día, sería más fácil de esta manera:

Comment.all(:conditions => ["date(created_at) = ?", some_date])


Solo una nota de que la respuesta aceptada actualmente está obsoleta en Rails 3. Debería hacer esto en su lugar:

Comment.where(:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day)

O bien, si desea o tiene que usar condiciones de cadenas puras , puede hacer:

Comment.where(''created_at BETWEEN ? AND ?'', @selected_date.beginning_of_day, @selected_date.end_of_day)


Yo personalmente crearía un alcance para hacerlo más legible y reutilizable:

En ti Comment.rb, puedes definir un alcance:

scope :created_between, lambda {|start_date, end_date| where("created_at >= ? AND created_at <= ?", start_date, end_date )}

Luego para consultar creado entre:

@comment.created_between(1.year.ago, Time.now)

Espero eso ayude.


hay varias formas Puedes usar este método:

start = @selected_date.beginning_of_day end = @selected_date.end_of_day @comments = Comment.where("DATE(created_at) BETWEEN ? AND ?", start, end)

O esto:

@comments = Comment.where(:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day)


Comment.find(:all, :conditions =>["date(created_at) BETWEEN ? AND ? ", ''2011-11-01'',''2011-11-15''])