¿Cómo debo escribir la declaración condicional para cuando quiero obtener todos los registros que se crearon hoy?
¿Cómo debo escribir la declaración condicional para cuando quiero obtener todos los registros que se crearon hoy?
Respuestas:
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
PD: Esta respuesta ha sido modificada porque la respuesta de Harish Shetty era mejor que la mía. Como mi respuesta es aceptada una. He actualizado esta respuesta para el apoyo de la comunidad.
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
es muy inteligente, lo respaldaría Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
. Hay un punto para hacerlo de una manera que pueda manipular el tiempo. Por ejemplo, si está probando, probablemente manipulará el tiempo y luego la primera opción no funcionará. Desea evitar ese tipo de posible falla futura que probablemente llevará algún tiempo de depuración.
Sé que esta pregunta tiene una respuesta aceptada. La solución sugerida en la respuesta aceptada puede causar problemas de rendimiento cuando aumenta el tamaño de la tabla.
Normalmente, si realiza búsquedas basadas en created_at
columnas, agregue un índice en la tabla en su archivo de migración.
add_index :posts, :created_at
Ahora, para buscar registros creados hoy:
Carriles 3/4
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
Para buscar publicaciones creadas en un día específico.
Post.where(:created_at => (date.beginning_of_day..date.end_of_day))
--------- O -------------
Agrega un método estático a tu modelo
class Post < ActiveRecord::Base
def self.today
where("created_at >= ?", Time.zone.now.beginning_of_day)
end
end
Post.today #returns posts today
Carriles 2
Post.all(:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day])
--------- O -------------
Agrega un named_scope a tu modelo
class Post < ActiveRecord::Base
named_scope :today, lambda {
{
:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day]
}
}
end
Post.today #returns posts today
scope
ejemplo de esta publicación es solo para Rails 3, ya que parece que está debajo del encabezado Rails 2. En Rails 2, necesitaría usar en named_scope
lugar de scope
. Además, en Rails 3, podría usar de manera equivalente un método de clase def self.today where("created_at >= ?", Time.now.beginning_of_day) end
que probablemente sea más limpio que usar un alcance en este caso, ya que le permite renunciar a la lambda.
La respuesta de Mohit Jain adaptada para Rails3
Model.where "DATE(created_at) = DATE(?)", Time.now
Rails 5.1 tiene un all_day
ayudante 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)
Esto "asigna nombres" al 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
between_period
parece interesante. No encontré ninguna documentación para ello. ¿Puede proporcionar algún enlace? ¿Cómo eligen los rieles la columna para comparar?
Para consultar registros creados a partir de hoy
Usar alcance con arel
class Post < ActiveRecord::Base
scope :create_from_today, -> {
where(arel_table[:created_at].gteq(Time.zone.now.beginning_of_day))
}
end
Entonces podemos usarlo
today_posts = Post.created_from_today
where('created_at >= now()')
solo encontraría elementos donde created_at estuviera en el futuro.
.lteq(Time.zone.now.end_of_day))
también.
En rails 4.2.3 para obtener los registros creados hoy, usando mysql use lo siguiente.
@usergoals = Goal.where ("userid =: userid y Date (created_at) =: date", {userid: params [: id], date: Date.today})
aquí estoy usando múltiples condiciones si lo desea, puede editarlo para una sola condición.