Antworten:
Verwenden von ActiveRecord auf standardmäßige Weise:
MyModel.where("created_at < ?", 2.days.ago)
Verwenden der zugrunde liegenden Arel- Schnittstelle:
MyModel.where(MyModel.arel_table[:created_at].lt(2.days.ago))
Mit einer dünnen Schicht über Arel:
MyModel.where(MyModel[:created_at] < 2.days.ago)
Mit Squeel :
MyModel.where { created_at < 2.days.ago }
So erhalten Sie alle Datensätze MyTable
, die bis vor 2 Tagen erstellt wurden:
MyTable.where(created_at: Date.new..2.days.ago)
Beachten Sie, dass Sie auch für Datensätze mit Feldern mit Feldern in Zukunft in ähnlicher Weise aussehen kann, dh alle Datensätze zu bekommen MyTable
mit einer event_date
mindestens 2 Tage ab sofort:
MyTable.where(event_date: 2.days.from_now..DateTime::Infinity.new)
"created_at" BETWEEN $1 AND $2 [["created_at", "4713-01-01 BC"], ["created_at", "2020-03-31 21:43:28.113759"]]
Eine andere Möglichkeit besteht darin, einen Bereich in MyModel
oder unter ApplicationRecord
Verwendung der Arel- Benutzeroberfläche wie tokland zu erstellen, der in seiner Antwort wie folgt unterstützt wird :
scope :arel, ->(column, predication, *args) { where(arel_table[column].public_send(predication, *args)) }
Beispiel für die Verwendung des Bereichs:
MyModel.arel(:created_at, :lt, 2.days.ago)
Überprüfen Sie für alle Prädikationen die Dokumentation oder den Quellcode . Dieser Bereich unterbricht die where
Kette nicht. Dies bedeutet, dass Sie auch Folgendes tun können:
MyModel.custom_scope1.arel(:created_at, :lt, 2.days.ago).arel(:updated_at, :gt, 2.days.ago).custom_scope2
Time.now bezieht sich auf jetzt oder genau diese Sekunde. Um also alle Benutzer vorher zu finden, verwenden Sie einfach
@users = User.all
Dadurch werden alle Benutzer zuvor gefunden und zukünftige Benutzer oder Benutzer, die nach Time.now beitreten, ausgeschlossen
MyTable1.where(MyTable[:created_at] < Time.now)
ist es möglich?