Comment dois-je écrire l'instruction conditionnelle lorsque je veux obtenir tous les enregistrements qui ont été créés aujourd'hui?
ruby-on-rails
date
rails-activerecord
Victor Lam
la source
la source
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
soit très intelligent, je souscrisPost.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
. Il y a un point à faire de manière à pouvoir manipuler le temps. Par exemple, si vous testez, vous manipulerez probablement le temps et la première option ne fonctionnera pas. Vous voulez éviter ce genre d'échec possible futur qui prendra probablement un certain temps de débogage.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.
En règle générale, si vous effectuez des recherches basées sur la
created_at
colonne, ajoutez un index sur la table dans votre fichier de migration.Maintenant, pour rechercher les enregistrements créés aujourd'hui:
Rails 3/4
Pour rechercher des articles créés un jour spécifique.
--------- OU -------------
Ajouter une méthode statique à votre modèle
Rails 2
--------- OU -------------
Ajoutez un named_scope à votre modèle
la source
scope
exemple de cet article concerne uniquement Rails 3, car il semble qu'il se trouve sous l'en-tête Rails 2. Dans Rails 2, vous devrez utilisernamed_scope
plutôt quescope
. De plus, dans Rails 3, vous pouvez utiliser de manière équivalente une méthode de classedef self.today where("created_at >= ?", Time.now.beginning_of_day) end
qui est probablement plus propre que d'utiliser une portée dans ce cas, car elle vous permet de renoncer au lambda.MySQL:
PostgreSQL:
la source
La réponse de Mohit Jain adaptée pour Rails3
la source
Rails 5.1 a une
all_day
aide utile ici.ou
la source
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
Cette "portée de nom" l'attribut avec le
table_name
.la source
model.rb
posts_controller.rb
la source
between_period
air intéressant. Je n'ai trouvé aucune documentation à ce sujet. Pouvez-vous fournir un lien? Comment les rails choisissent-ils la colonne à comparer?Pour une raison quelconque, aucune des autres solutions de cet article ni d'autres sur StackOverflow n'ont fonctionné pour moi (en utilisant Rails 4.2.4 et Ruby 2.2.3p173). C'est la seule requête que je pourrais obtenir pour travailler avec ma base de données Postgres:
la source
Pour interroger les enregistrements créés à partir d'aujourd'hui
Utilisez Scope avec Arel
Ensuite, nous pouvons l'utiliser
la source
where('created_at >= now()')
ne trouverait que les éléments où le created_at était dans le futur..lteq(Time.zone.now.end_of_day))
.Dans les rails 4.2.3 pour obtenir les enregistrements créés aujourd'hui, en utilisant mysql, utilisez ce qui suit.
@usergoals = Goal.where ("userid =: userid and Date (created_at) =: date", {userid: params [: id], date: Date.today})
ici, j'utilise plusieurs conditions si vous le souhaitez, vous pouvez le modifier pour une seule condition.
la source