Record attivo: trova i record creati_at prima di oggi


87

Voglio ottenere tutti i record in cui il campo created_at è inferiore a oggi (una data). C'è qualcosa come:

MyTable.find_by_created_at(< 2.days.ago)

Risposte:


167

Utilizzo di ActiveRecord in modo standard:

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

Utilizzando l' interfaccia Arel sottostante :

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

Usando uno strato sottile su Arel:

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

Utilizzando squeel :

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

Grazie!. Se ho bisogno di tutti i record da MyTable1 che è una relazione uno a uno con MyTable alle stesse condizioni, come scrivere la query? Mi riferivo a qualcosa come MyTable1.where(MyTable[:created_at] < Time.now)è possibile?
Sayuj

Sì, ho impostato la classe record attiva della relazione.
Sayuj

11

Per ottenere tutti i record di MyTablecreazione fino a 2 giorni fa:

MyTable.where(created_at: Date.new..2.days.ago)

Tieni presente che puoi anche cercare i record con campi contenenti campi in futuro in modo simile, cioè per ottenere tutti i record di MyTablecon event_datealmeno 2 giorni da adesso:

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

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

2

Un altro modo è creare un ambito all'interno MyModelo ApplicationRecordnell'utilizzo dell'interfaccia di Arel come tokland suggerito nella sua risposta in questo modo:

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

Esempio di utilizzo dell'ambito:

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

Per tutte le previsioni, controlla la documentazione o il codice sorgente . Questo scopo non interrompe la wherecatena. Ciò significa che puoi anche fare:

MyModel.custom_scope1.arel(:created_at, :lt, 2.days.ago).arel(:updated_at, :gt, 2.days.ago).custom_scope2

Idea fantastica. Tuttavia, ActiveRecord::Relationdefinisce un metodo di istanza con il nome, il arelche significa che devi solo scegliere un nome diverso.
M-Dahab,

-36

Time.now si riferisce a adesso o proprio in questo secondo. Quindi per trovare tutti gli utenti prima in questo momento basta usare

@users = User.all

Questo troverà tutti gli utenti prima in questo momento ed escluderà gli utenti futuri o gli utenti che si uniranno dopo Time.now


1
Time.now non è lo stesso di Today
John Naegle
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.