Aktif Kayıt - Bugünden önce oluşturulmuş kayıtları bulun


87

Created_at alanının bugünden (tarih) daha az olduğu tüm kayıtları almak istiyorum. Şunun gibi bir şey var mı:

MyTable.find_by_created_at(< 2.days.ago)

Yanıtlar:


171

ActiveRecord'u standart şekilde kullanma :

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

Temeldeki Arel arayüzünü kullanarak :

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

Arel üzerine ince bir tabaka kullanarak :

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

Squeel kullanma :

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

Teşekkürler!. Aynı koşulda MyTable ile bire bir ilişki olan MyTable1'deki tüm kayıtlara ihtiyacım olursa, sorgu nasıl yazılır? MyTable1.where(MyTable[:created_at] < Time.now)Mümkün mü gibi bir şeyden bahsediyordum ?
Sayuj

Evet İlişkili aktif kayıt sınıfını ayarladım.
Sayuj

12

MyTable2 gün öncesine kadar oluşturulan tüm kayıtları almak için :

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

Ayrıca alanların tüm kayıtları almak için yani benzer şekilde gelecekte alanları içeren kayıtları arar ki Not MyTablebir ile event_dateşimdi en az 2 gün:

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

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

3

Diğer bir yolu bir kapsam yaratmaktır MyModelveya ApplicationRecordkullanan Arel gibi arayüz tokland içinde sugensted onun cevabını şöyle:

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

Kapsamın örnek kullanımı:

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

Tüm tahminler için belgeleri veya kaynak kodunu kontrol edin . Bu kapsam wherezinciri kırmaz . Bu, şunları da yapabileceğiniz anlamına gelir:

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

Harika fikir. Ancak, ActiveRecord::Relationadla bir örnek yöntemi tanımlar; arelbu, yalnızca farklı bir ad seçmeniz gerektiği anlamına gelir.
M-Dahab

-35

Time.now, şu an veya bu tam saniye anlamına gelir. Bu nedenle, şimdiye kadar tüm kullanıcıları bulmak için şunu kullanın:

@users = User.all

Bu, şu andan önceki tüm kullanıcıları bulacak ve gelecekteki kullanıcıları veya Zamanın ardından katılan kullanıcıları hariç tutacaktır. Şimdi


1
Time.now, Bugün ile aynı değil
John Naegle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.