フィールドを持つ本のテーブルがありauthor_id
ます。
すべての著者の本を 1 つだけ含む本の配列を取得したいと思います。最新のupdated_at
フィールドを持つもの。
Postgresのような単純なアプローチの問題Books.all.group('author_id')
は、要求されたすべてのフィールドがそのGROUP BY
ブロックに必要であることです。( https://stackoverflow.com/a/6106195/1245302を参照)
しかし、他のすべてのフィールドを無視して、すべての Book オブジェクトを著者ごとに 1 つずつ、最近のオブジェクトを取得する必要があります。DBMSが必要な行を正確に見つけるのに十分なデータがあるように思えます.少なくとも、GROUP BY
ブロック内の他のフィールドなしで自分でそれを行うことができました. :)
簡単な Rails 3 + Postgres (バージョン < 9) または SQL 実装に依存しない方法はありますか?
UPDATE Postgresの素敵なソリューション:
books.unscoped.select('DISTINCT ON(author_id) *').order('author_id').order('updated_at DESC')
しかし!まだ問題が残っています – 結果はauthor_id
最初に並べ替えられupdated_at
ますが、同じauthor_id
-s 内で並べ替える必要があります (見つけるには、最近の本の著者の上位 10 人と言います)。
また、Postgres では、クエリのORDER BY
引数の順序を変更することはできません:(DISTINCT