Comment dois-je écrire l'instruction conditionnelle lorsque je veux obtenir tous les enregistrements créés aujourd'hui?
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
PS: Cette réponse a été modifiée car la réponse de Harish Shetty était meilleure que la mienne. Comme ma réponse est acceptée un. J'ai mis à jour cette réponse pour le soutien de la communauté
Je sais que cette question a une réponse acceptée. La solution suggérée dans la réponse acceptée peut entraîner des problèmes de performances lorsque la taille de la table augmente.
Généralement, si vous effectuez des recherches sur created_at
colonne, ajoutez un index sur la table dans votre fichier de migration.
add_index :posts, :created_at
Maintenant, pour rechercher des enregistrements créés aujourd'hui:
Rails 3/4
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
Pour rechercher des messages créés un jour spécifique.
Post.where(:created_at => (date.beginning_of_day..date.end_of_day))
--------- [~ # ~] ou [~ # ~] ------------ -
Ajouter une méthode statique à votre modèle
class Post < ActiveRecord::Base
def self.today
where("created_at >= ?", Time.zone.now.beginning_of_day)
end
end
Post.today #returns posts today
Rails 2
Post.all(:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day])
--------- [~ # ~] ou [~ # ~] ------------ -
Ajouter un named_scope à votre modèle
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
La réponse de Mohit Jain adaptée pour Rails3
Model.where "DATE(created_at) = DATE(?)", Time.now
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
Cet "namescopes" l'attribut avec le table_name
.
Rails 5.1 a un all_day
assistant utile ici.
Post.where(created_at: Date.today.all_day)
ou
Post.where(created_at: Date.parse("YYYY-MM-DD").all_day)
model.rb
scope :posted_today, -> { posted_between_period(Time.now.midnight, Time.now.end_of_day) }
posts_controller.rb
Post.posted_today
Pour une raison quelconque, aucune des solutions de ce billet ni les autres solutions de StackOverflow ne fonctionnaient pour moi (avec Rails 4.2.4 et Ruby 2.2.3p173). C’est la seule requête possible pour ma base de données Postgres:
Post.where("created_at >= TIMESTAMP 'now'")