Active Record – Trouvez les enregistrements qui ont été créés_at avant aujourd’hui

Je veux obtenir tous les enregistrements dont 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) 

En utilisant ActiveRecord de manière standard:

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

En utilisant l'interface Arel sous-jacente:

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

En utilisant une fine couche sur Arel:

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

En utilisant squeel :

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

Une autre méthode consiste à créer une scope dans MyModel ou dans ApplicationRecord utilisant l’interface Arel telle que tokland proposée dans sa réponse comme suit:

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

Exemple d’utilisation de la scope:

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

Pour toutes les prédications, vérifiez la documentation ou le code source . Cette scope ne casse pas la chaîne where . 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 

Time.now se réfère à présent ou à cette seconde. Donc, pour trouver tous les utilisateurs avant maintenant, utilisez simplement

 @users = User.all 

Cela va trouver tous les utilisateurs avant maintenant et exclura les futurs utilisateurs ou utilisateurs qui rejoignent après Time.now