Pregunta

¿Cómo debo escribir la sentencia condicional para cuando quiero obtener todos los registros que fueron creados hoy?

¿Fue útil?

Solución

Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)

PD: Esta respuesta ha sido modificado como respuesta por Harish Shetty era mejor que la mía. Como mi respuesta se acepta una. He actualizado esta respuesta de apoyo de la comunidad

Otros consejos

Sé que esta pregunta tiene una respuesta aceptada. La solución propuesta en la respuesta aceptada puede causar problemas de rendimiento cuando el tamaño de la tabla crece.

Por lo general, si lleva a cabo operaciones de búsqueda basado en la columna created_at, añadir un índice en la tabla en el archivo de migración.

add_index :posts, :created_at

Ahora, para buscar registros creados hoy en día:

Rieles 3/4

Post.where("created_at >= ?", Time.zone.now.beginning_of_day)

Para las operaciones de búsqueda puestos creados en un día específico.

Post.where(:created_at => (date.beginning_of_day..date.end_of_day))

--------- o -------------

Añadir un método estático para su modelo

class Post < ActiveRecord::Base
  def self.today
    where("created_at >= ?", Time.zone.now.beginning_of_day)
  end
end

Post.today #returns posts today

raíles 2

Post.all(:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day])

--------- o -------------

Añadir un named_scope a su modelo

class Post < ActiveRecord::Base    
  named_scope :today, lambda { 
    {
      :conditions => ["created_at >= ?", Time.zone.now.beginning_of_day]
    }
  }
end

Post.today #returns posts today

MySQL:

Model.all :condition => ["DATE(created_at) = ?", Date.today] # rails 2
Model.where("DATE(created_at) = ?", Date.today) # rails 3

PostgreSQL:

Model.all :condition => ["created_at::date = ?", Date.today] # rails 2
Model.where("created_at::date = ?", Date.today) # rails 3

respuesta de Mohit Jain adaptado para Rails3

Model.where "DATE(created_at) = DATE(?)", Time.now

Los carriles 5.1 tiene un ayudante all_day que es útil aquí.

Post.where(created_at: Date.today.all_day)

o

Post.where(created_at: Date.parse("YYYY-MM-DD").all_day)

Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)

Este "namescopes" atributo con el table_name.

model.rb

scope :posted_today, -> { posted_between_period(Time.now.midnight, Time.now.end_of_day) }

posts_controller.rb

Post.posted_today

Por alguna razón, ninguna de las otras soluciones en este post ni otros en StackOverflow trabajó para mí (usando Rails 4.2.4 y Rubí 2.2.3p173). Esta es la única consulta que pude llegar a mi trabajo con base de datos PostgreSQL:

Post.where("created_at >= TIMESTAMP 'now'")

Para los registros de consulta que crearon a partir de hoy

Uso alcance con Arel

class Post < ActiveRecord::Base    
  scope :create_from_today, -> {
    where(arel_table[:created_at].gteq(Time.zone.now.beginning_of_day))
  }
end

A continuación, podemos usarlo

today_posts = Post.created_from_today

En los carriles 4.2.3 para obtener los registros creados hoy en día, el uso de MySQL utilizar la siguiente.

@usergoals = Goal.where ( "ID de usuario =: ID de usuario y la fecha (created_at) =: fecha", {ID de usuario: params [: id], fecha: Date.today})

Aquí estoy utilizando múltiples condiciones, si lo desea, puede editarlo para una sola condición.

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