Rekaman Aktif - Temukan catatan yang dibuat_at sebelum hari ini

87

Saya ingin mendapatkan semua catatan di mana bidang create_at kurang dari hari ini (tanggal). Apa ada yang seperti ini:

MyTable.find_by_created_at(< 2.days.ago)
Sayuj
sumber

Jawaban:

171

Menggunakan ActiveRecord dengan cara standar:

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

Menggunakan antarmuka Arel yang mendasari :

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

Menggunakan lapisan tipis di atas Arel:

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

Menggunakan squeel :

MyModel.where { created_at < 2.days.ago }
tokland
sumber
Terima kasih!. Jika saya memerlukan semua catatan dari MyTable1 yang merupakan relasi satu ke satu dengan MyTable pada kondisi yang sama, bagaimana cara menulis kueri? Saya merujuk sesuatu seperti MyTable1.where(MyTable[:created_at] < Time.now)apakah itu mungkin?
Sayuj
Ya, saya telah menetapkan kelas rekaman relasi aktif.
Sayuj
12

Untuk mendapatkan semua catatan yang MyTabledibuat hingga 2 hari yang lalu:

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

Perhatikan bahwa Anda juga dapat mencari catatan dengan bidang yang berisi bidang di masa mendatang dengan cara yang sama, yaitu untuk mendapatkan semua catatan MyTabledengan event_datesetidaknya 2 hari dari sekarang:

MyTable.where(event_date: 2.days.from_now..DateTime::Infinity.new)
Andreas
sumber
Ini menghasilkan"created_at" BETWEEN $1 AND $2 [["created_at", "4713-01-01 BC"], ["created_at", "2020-03-31 21:43:28.113759"]]
Pavel Chuchuva
3

Cara lain adalah dengan membuat scope di dalam MyModelatau ApplicationRecordmenggunakan interface Arel seperti tokland sugensted dalam jawabannya seperti ini:

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

Contoh penggunaan ruang lingkup:

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

Untuk semua prediksi, periksa dokumentasi atau kode sumber . Cakupan ini tidak memutuskan whererantai. Artinya, Anda juga dapat melakukan:

MyModel.custom_scope1.col(:created_at, :lt, 2.days.ago).col(:updated_at, :gt, 2.days.ago).custom_scope2
3limin4t0r
sumber
Ide yang fantastis. Tapi, ActiveRecord::Relationmendefinisikan metode instance dengan nama arelyang berarti Anda hanya perlu memilih nama yang berbeda.
M-Dahab
-35

Time.now mengacu pada sekarang atau detik ini. Jadi untuk menemukan semua pengguna sebelumnya sekarang cukup gunakan

@users = User.all

Ini akan menemukan semua pengguna sebelumnya sekarang dan akan mengecualikan pengguna atau pengguna mendatang yang bergabung setelah Time.now

Homer Jon
sumber
1
Waktu sekarang tidak sama dengan Hari Ini
John Naegle