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:
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 }
Untuk mendapatkan semua catatan yang MyTable
dibuat 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 MyTable
dengan event_date
setidaknya 2 hari dari sekarang:
MyTable.where(event_date: 2.days.from_now..DateTime::Infinity.new)
"created_at" BETWEEN $1 AND $2 [["created_at", "4713-01-01 BC"], ["created_at", "2020-03-31 21:43:28.113759"]]
Cara lain adalah dengan membuat scope di dalam MyModel
atau ApplicationRecord
menggunakan 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 where
rantai. Artinya, Anda juga dapat melakukan:
MyModel.custom_scope1.col(:created_at, :lt, 2.days.ago).col(:updated_at, :gt, 2.days.ago).custom_scope2
ActiveRecord::Relation
mendefinisikan metode instance dengan nama arel
yang berarti Anda hanya perlu memilih nama yang berbeda.
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
MyTable1.where(MyTable[:created_at] < Time.now)
apakah itu mungkin?