Chcę uzyskać wszystkie rekordy, w których pole created_at jest mniejsze niż dzisiaj (data). Czy jest coś takiego:
MyTable.find_by_created_at(< 2.days.ago)
ruby
activerecord
Sayuj
źródło
źródło
MyTable1.where(MyTable[:created_at] < Time.now)
czy to możliwe?Aby uzyskać wszystkie rekordy
MyTable
utworzone do 2 dni temu:MyTable.where(created_at: Date.new..2.days.ago)
Zauważ, że możesz również szukać rekordów z polami zawierającymi pola w przyszłości w podobny sposób, tj. Aby uzyskać wszystkie rekordy
MyTable
zevent_date
co najmniej 2 dni od teraz:MyTable.where(event_date: 2.days.from_now..DateTime::Infinity.new)
źródło
"created_at" BETWEEN $1 AND $2 [["created_at", "4713-01-01 BC"], ["created_at", "2020-03-31 21:43:28.113759"]]
Innym sposobem jest utworzenie zakresu w
MyModel
lub przyApplicationRecord
użyciu interfejsu Arel , takiego jak tokland sugerowany w jego odpowiedzi :scope :arel, ->(column, predication, *args) { where(arel_table[column].public_send(predication, *args)) }
Przykładowe wykorzystanie zakresu:
MyModel.arel(:created_at, :lt, 2.days.ago)
W przypadku wszystkich przewidywań sprawdź dokumentację lub kod źródłowy . Ten zakres nie przerywa
where
łańcucha. Oznacza to, że możesz również:MyModel.custom_scope1.arel(:created_at, :lt, 2.days.ago).arel(:updated_at, :gt, 2.days.ago).custom_scope2
źródło
ActiveRecord::Relation
definiuje metodę instancji o nazwie,arel
co oznacza, że wystarczy wybrać inną nazwę.Time.now odnosi się teraz lub w tej chwili. Aby znaleźć wszystkich użytkowników wcześniej, po prostu użyj
Spowoduje to znalezienie wszystkich użytkowników wcześniejszych w tej chwili i wykluczenie przyszłych użytkowników lub użytkowników, którzy dołączą po Time.now
źródło