ruby-on-rails - now - rails timestamp to date
¿Cómo obtener un registro creado hoy por rails activerecord? (9)
¿Cómo debería escribir la declaración condicional para cuando quiero obtener todos los registros que se crearon hoy?
En los rieles 4.2.3 para obtener los registros creados hoy, usando mysql use lo siguiente.
@usergoals = Goal.where ("userid =: ID de usuario y Fecha (created_at) =: date", {userid: params [: id], date: Date.today})
aquí estoy usando múltiples condiciones si quieres puedes editarlo por una sola condición.
La respuesta de Mohit Jain adaptada para Rails3
Model.where "DATE(created_at) = DATE(?)", Time.now
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
Para consultar registros que se crearon 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
Usar alcance con consulta sin formato
class Post < ActiveRecord::Base
scope :create_from_today, -> {
where(''created_at >= now()'')
}
end
Entonces podemos usarlo
today_posts = Post.created_from_today
Por alguna razón, ninguna de las otras soluciones en este post ni otras en funcionó para mí (usando Rails 4.2.4 y Ruby 2.2.3p173). Esta es la única consulta que pude obtener para trabajar con mi base de datos de Postgres:
Post.where("created_at >= TIMESTAMP ''now''")
Sé que esta pregunta tiene una respuesta aceptada. La solución sugerida en la respuesta aceptada puede causar problemas de rendimiento cuando crece el tamaño de la tabla.
Normalmente, si realiza búsquedas basadas en la columna created_at
, agregue un índice en la tabla en su archivo de migración.
add_index :posts, :created_at
Ahora, para buscar registros creados hoy:
Rieles 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 -------------
Agregue un método estático a 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
Carriles 2
Post.all(:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day])
--------- O -------------
Agregue 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
model.rb
scope :posted_today, -> { posted_between_period(Time.now.midnight, Time.now.end_of_day) }
posts_controller.rb
Post.posted_today
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
Este "namescopes" el atributo con table_name
.
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
PD: Esta respuesta ha sido modificada porque Harish Shetty respondió que era mejor que la mía. Como mi respuesta es aceptada. He actualizado esta respuesta para el apoyo de la comunidad