Aktiver Datensatz - Suchen Sie Datensätze, die vor heute erstellt wurden


85

Ich möchte alle Datensätze abrufen, bei denen das Feld created_at kleiner als heute ist (ein Datum). Gibt es so etwas wie:

MyTable.find_by_created_at(< 2.days.ago)

Antworten:


160

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 }

Vielen Dank!. Wie schreibe ich die Abfrage, wenn ich alle Datensätze von MyTable1 benötige, bei denen es sich um eine Eins-zu-Eins-Beziehung zu MyTable unter denselben Bedingungen handelt? Ich bezog mich auf etwas wie MyTable1.where(MyTable[:created_at] < Time.now)ist es möglich?
Sayuj

Ja, ich habe die Relation Active Record Class festgelegt.
Sayuj

11

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 MyTablemit einer event_datemindestens 2 Tage ab sofort:

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

Dies produziert"created_at" BETWEEN $1 AND $2 [["created_at", "4713-01-01 BC"], ["created_at", "2020-03-31 21:43:28.113759"]]
Pavel Chuchuva

1

Eine andere Möglichkeit besteht darin, einen Bereich in MyModeloder unter ApplicationRecordVerwendung 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 whereKette 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

-33

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


1
Time.now ist nicht dasselbe wie Today
John Naegle
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.