web-dev-qa-db-fra.com

Comment obtenir un enregistrement créé aujourd'hui par Rails activerecord?

Comment dois-je écrire l'instruction conditionnelle lorsque je veux obtenir tous les enregistrements créés aujourd'hui?

105
Victor Lam
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é

204
Mohit Jain

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
119
Harish Shetty

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
29
jigfox

La réponse de Mohit Jain adaptée pour Rails3

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

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

Cet "namescopes" l'attribut avec le table_name.

7
Rafael Oliveira

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)
7
StevenClontz

model.rb

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

posts_controller.rb

Post.posted_today
5
Parthiv

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'")
1
Tim S