PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Elegante PostgreSQL-Gruppe von für Ruby on Rails / ActiveRecord

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.