Cómo obtener el registro creado hoy por los carriles activerecord?
-
05-10-2019 - |
Pregunta
¿Cómo debo escribir la sentencia condicional para cuando quiero obtener todos los registros que fueron creados hoy?
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.