101 votes

Active Record - Trouvez les enregistrements qui ont été créés avant aujourd'hui.

Je veux obtenir tous les enregistrements dont le champ created_at est inférieur à aujourd'hui (une date). Existe-t-il quelque chose comme :

MyTable.find_by_created_at(< 2.days.ago)

195voto

tokland Points 29813

Utilisation de ActiveRecord de la manière habituelle :

MyModel.where("created_at < ?", 2.days.ago)

En utilisant les données sous-jacentes Arel interface :

MyModel.where(MyModel.arel_table[:created_at].lt(2.days.ago))

En utilisant quelques couche fine sur Arel :

MyModel.where(MyModel[:created_at] < 2.days.ago)

Utilisation de grincement :

MyModel.where { created_at < 2.days.ago }

14voto

Andreas Points 320

Pour obtenir tous les enregistrements de MyTable créé jusqu'à il y a 2 jours :

MyTable.where(created_at: Date.new..2.days.ago)

Notez que vous pouvez également rechercher des enregistrements dont les champs contiennent des champs dans le futur de manière similaire, c'est-à-dire pour obtenir tous les enregistrements de la catégorie MyTable avec un event_date au moins 2 jours à partir de maintenant :

MyTable.where(event_date: 2.days.from_now..DateTime::Infinity.new)

1 votes

Cela produit "created_at" BETWEEN $1 AND $2 [["created_at", "4713-01-01 BC"], ["created_at", "2020-03-31 21:43:28.113759"]]

3voto

Johan Wentholt Points 2137

Une autre méthode consiste à créer une portée dans MyModel ou dans ApplicationRecord en utilisant le Arel interface comme tokland Suggéré dans sa réponse comme ça :

scope :col, ->(column, predication, *args) { where(arel_table[column].public_send(predication, *args)) }

Exemple d'utilisation de la portée :

MyModel.col(:created_at, :lt, 2.days.ago)

Pour toutes les prédictions, vérifiez le documentation ou code source . Cette portée ne casse pas le where chaîne. Cela signifie que vous pouvez aussi le faire :

MyModel.custom_scope1.col(:created_at, :lt, 2.days.ago).col(:updated_at, :gt, 2.days.ago).custom_scope2

-36voto

Homer Jon Points 857

Time.now fait référence à l'instant présent ou à cette seconde même. Ainsi, pour trouver tous les utilisateurs avant maintenant, il suffit d'utiliser

@users = User.all

Cela trouvera tous les utilisateurs avant maintenant et exclura les utilisateurs futurs ou ceux qui se joindront après Time.now.

1 votes

Time.now n'est pas la même chose que Today

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X