Pregunta

necesito comentarios consulta realizada 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 utilizar ActiveRecord hacer eso?

Necesito algo como:

"SELECT * FROM comments WHERE created_at BETWEEN '2010-02-03 00:00:00' AND '2010-02-03 23:59:59'"
¿Fue útil?

Solución

Sólo una nota que la respuesta aceptada actualmente está en desuso en Rails 3. Debe hacer esto en su lugar:

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

O, si quieren o tienen que usar condiciones de cuerda puros , que puede hacer:

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

Otros consejos

Me personalmente creado un ámbito para que sea más fácil de leer y reutilizable:

En Comment.rb usted, usted puede definir un ámbito:

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

Luego de consulta creada entre:

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

Espero que ayuda.

Este código debe trabajar para usted:

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

Para obtener más información echar un vistazo a Tiempo

Nota: Este código es obsoleta . Utilice el código de la respuesta si usted está usando Rails 3.1 / 3.2

Los carriles 5.1 introdujo una nueva fecha ayudante método all_day, consulte: https://github.com/ rieles / rieles / tirón / 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á usando Rails 5.1, la consulta se vería así:

Comment.where(created_at: @selected_date.all_day)

Me encontré este código para ver si la respuesta comprobado trabajó, y tenía que probar el intercambio en torno a las fechas para hacerlo bien. Esto funcionó -

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

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

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

He estado usando los 3 puntos, en lugar de 2. Tres puntos le da un rango que está abierto al principio y al final cerrada, por lo que si usted hace 2 consultas de rangos posteriores, no se puede obtener el mismo remar de vuelta en 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 utilizar un alcance!

Si sólo desea conseguir un día sería más fácil de esta manera:

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

hay varias maneras. Puede utilizar 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)

No debe ser un comportamiento registro activo por defecto en este calculo. Consultar fechas es difícil, especialmente cuando se trata de zonas horarias.

De todos modos, yo 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
  }

Se podría utilizar a continuación joya de encontrar los registros entre las fechas,

Esta joya muy fácil de usar y más clara Por estrellas estoy usando esta joya y la API más clara y la documentación también bien explicado.

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

A continuación, usted podría pasar a nuestro campo también Post.by_month("January", field: :updated_at)

Por favor, consulte la documentación y probarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top