Den PostgreSQL-funktion, du vil bruge her, er DISTINCT ON
. Der er to grundlæggende måder at lave denne forespørgsel på via ActiveRecord.
Den første metode er blot at angive :select
og :order
muligheder. Dette fungerer godt, når du har en ret simpel forespørgsel uden :joins
eller :include
.
Post.all(
:select => 'DISTINCT ON (date::date) *',
:order => 'date::date DESC, created_at DESC'
)
Hvis du har en mere kompleks forespørgsel, hvor ActiveRecord genererer sin egen SELECT
klausul, kan du bruge en underforespørgsel til at vælge målposterne.
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'
)
Bemærk, at dette kan være en smule langsommere end den første metode afhængigt af dine data. Jeg ville kun bruge denne metode, hvis det var nødvendigt. Sørg for at benchmarke med produktionslignende data.