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)

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 }

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)

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

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


1
Waktu sekarang tidak sama dengan Hari Ini
John Naegle
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.