Je veux obtenir tous les enregistrements où le champ created_at est inférieur à aujourd'hui (une date). Y a-t-il quelque chose comme:
MyTable.find_by_created_at(< 2.days.ago)
ruby
activerecord
Sayuj
la source
la source
MyTable1.where(MyTable[:created_at] < Time.now)
est-ce possible?Pour obtenir tous les enregistrements
MyTable
créés jusqu'à il y a 2 jours:MyTable.where(created_at: Date.new..2.days.ago)
Notez que vous pouvez également rechercher des enregistrements avec des champs contenant des champs dans le futur de la même manière, c'est-à-dire pour obtenir tous les enregistrements
MyTable
avecevent_date
au moins 2 jours à partir de maintenant:MyTable.where(event_date: 2.days.from_now..DateTime::Infinity.new)
la source
"created_at" BETWEEN $1 AND $2 [["created_at", "4713-01-01 BC"], ["created_at", "2020-03-31 21:43:28.113759"]]
Une autre façon est de créer une portée dans
MyModel
ou enApplicationRecord
utilisant l' interface Arel comme tokland suggéré dans sa réponse comme ceci:scope :arel, ->(column, predication, *args) { where(arel_table[column].public_send(predication, *args)) }
Exemple d'utilisation de la portée:
MyModel.arel(:created_at, :lt, 2.days.ago)
Pour toutes les prédications, consultez la documentation ou le code source . Cette portée ne rompt pas la
where
chaîne. Cela signifie que vous pouvez également faire:MyModel.custom_scope1.arel(:created_at, :lt, 2.days.ago).arel(:updated_at, :gt, 2.days.ago).custom_scope2
la source
ActiveRecord::Relation
définit une méthode d'instance avec le nom,arel
ce qui signifie que vous devez simplement choisir un nom différent.Time.now fait référence à maintenant ou à cette seconde. Donc, pour trouver tous les utilisateurs avant maintenant, utilisez simplement
Cela trouvera tous les utilisateurs avant maintenant et exclura les futurs utilisateurs ou utilisateurs qui se joindront après Time.now
la source