ここで使用するPostgreSQLの機能は、 DISTINCT ON
。 ActiveRecordを介してこのクエリを実行するには、2つの基本的な方法があります。
最初の方法は、:select
を指定することです。 および:order
オプション。これは、:joins
のない非常に単純なクエリがある場合に最適です。 または:include
。
Post.all(
:select => 'DISTINCT ON (date::date) *',
:order => 'date::date DESC, created_at DESC'
)
ActiveRecordが独自のSELECT
を生成するより複雑なクエリがある場合 句を使用すると、サブクエリを使用してターゲットレコードを選択できます。
Post.all(
:joins => 'INNER JOIN (SELECT DISTINCT ON (date::date) id FROM posts ORDER BY date::date DESC, created_at DESC) x ON x.id = posts.id'
)
データによっては、これは最初の方法よりもかなり遅くなる可能性があることに注意してください。この方法は、必要な場合にのみ使用します。必ず本番環境のようなデータでベンチマークを行ってください。