Comment obtenir de l'enregistrement créé aujourd'hui par les rails activerecord?
Comment dois-je écrire l'instruction conditionnelle pour quand je veux obtenir tous les enregistrements qui ont été créés aujourd'hui?
Vous devez vous connecter pour publier un commentaire.
PS: Cette réponse a été modifiée en tant que de répondre par Harish Shetty a été 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é
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
est très intelligent, je partagePost.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
. Il y a un point pour faire en sorte que vous pouvez manipuler le temps. Par exemple, si vous testez, vous aurez probablement manipuler le temps et puis la première option ne fonctionnera pas. Vous voulez éviter ce genre de futurs possibles de l'échec qui va probablement prendre un certain temps de débogage.Je sais que cette question a accepté de répondre. La solution proposée dans l'acceptation de réponse 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
created_at
colonne, ajouter un index sur la table dans votre fichier de migration.Maintenant, pour la recherche de documents créés aujourd'hui:
Rails 3/4
Pour la recherche de postes créés sur un jour spécifique.
--------- OU -------------
Ajouter une méthode statique pour votre modèle de
Rails 2
--------- OU -------------
Ajouter un named_scope à votre modèle
scope
exemple dans ce post est pour Rails 3, seulement, car il semble que c'est sous les Rails 2 rubrique. Dans Rails 2, vous devez utilisernamed_scope
plutôt quescope
. Aussi, dans Rails 3, on peut de manière équivalente, l'utilisation d'une méthode de classedef self.today where("created_at >= ?", Time.now.beginning_of_day) end
qui est probablement plus propre qu'à l'aide d'un champ d'application dans ce cas, puisqu'il permet de renoncer à la lambda.MySQL:
PostgreSQL:
Mohit Jain réponse adaptée pour Rails3
Rails 5.1 a un
all_day
assistant qui est utile ici.ou
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
Cette "portées de nom", l'attribut avec le
table_name
.modèle.rb
posts_controller.rb
Pour une raison quelconque, aucune des autres solutions dans ce post, ni les autres sur StackOverflow a fonctionné pour moi (à l'aide de Rails 4.2.4 et Ruby 2.2.3p173). C'est la seule requête que je puisse arriver à travailler avec ma base de données Postgres:
Pour les enregistrements de requête qui a créé à partir d'aujourd'hui
Portée d'utilisation avec arel
Alors nous pouvons l'utiliser
where('created_at >= now()')
ne pourrait trouver des éléments pour lesquels les created_at était l'avenir..lteq(Time.zone.now.end_of_day))
ainsi.Dans les rails 4.2.3 pour obtenir les dossiers créés aujourd'hui, l'utilisation de mysql utilisation suivantes.
@usergoals = Objectif.où("userid = :id utilisateur et la Date(created_at) = :date", { userid: params[:id], date: date.aujourd'hui })
ici, je suis à l'aide de plusieurs conditions, si vous voulez, vous pouvez le modifier pour seule condition.