アクティブレコード-今日より前に作成されたレコードを検索します


87

created_atフィールドが今日(日付)よりも小さいすべてのレコードを取得したいと思います。次のようなものはありますか?

MyTable.find_by_created_at(< 2.days.ago)

回答:


167

ActiveRecordを標準的な方法で使用する:

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

基盤となるArelインターフェースの使用:

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

アレルの上に薄い層を使用する:

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

squeelの使用:

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

ありがとう!同じ条件でMyTableと1対1の関係にあるMyTable1のすべてのレコードが必要な場合、クエリを作成するにはどうすればよいですか?私MyTable1.where(MyTable[:created_at] < Time.now)はそれが可能であるような何かを参照していましたか?
Sayuj 2011年

はい、リレーションアクティブレコードクラスを設定しました。
Sayuj 2011年

11

MyTable2日前までに作成されたすべてのレコードを取得するには:

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

あなたはまた、すべてのレコードを取得するには、同様の方法で、将来のフィールドを含むフィールドを持つレコードをつまりを見ることができることを注意MyTableしてevent_date、今から少なくとも2日間:

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"]]
パベルChuchuva

2

別の方法は、次のように彼の答えで提唱されtoklandのようなArelインターフェース内MyModelまたはApplicationRecord使用中にスコープを作成することです。

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

スコープの使用例:

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

すべての述語については、ドキュメントまたはソースコードを確認してください。このスコープはwhereチェーンを壊しません。これは、次のこともできることを意味します。

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

素晴らしいアイデア。ただし、ActiveRecord::Relation名前arelを使用してインスタンスメソッドを定義します。これは、別の名前を選択する必要があることを意味します。
M-ダハブ

-36

Time.nowは、現在またはこの2番目を指します。したがって、今までにすべてのユーザーを見つけるには、

@users = User.all

これにより、現在以前のすべてのユーザーが検索され、将来のユーザーまたはTime.now以降に参加するユーザーが除外されます。


1
Time.nowはTodayと同じではありません
John Naegle 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.