Die PostgreSQL-Funktion, die Sie hier verwenden möchten, ist DISTINCT ON
. Es gibt zwei grundlegende Möglichkeiten, diese Abfrage über ActiveRecord durchzuführen.
Die erste Methode besteht darin, einfach :select
anzugeben und :order
Optionen. Dies funktioniert hervorragend, wenn Sie eine ziemlich einfache Abfrage ohne :joins
haben oder :include
.
Post.all(
:select => 'DISTINCT ON (date::date) *',
:order => 'date::date DESC, created_at DESC'
)
Wenn Sie eine komplexere Abfrage haben, bei der ActiveRecord seinen eigenen SELECT
generiert -Klausel können Sie eine Unterabfrage verwenden, um die Zieldatensätze auszuwählen.
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'
)
Beachten Sie, dass dies abhängig von Ihren Daten etwas langsamer sein kann als die erste Methode. Ich würde diese Methode nur bei Bedarf anwenden. Vergleichen Sie unbedingt mit produktionsähnlichen Daten.