PostgreSQL-funktionen du vill använda här är DISTINCT ON
. Det finns två grundläggande sätt att göra den här frågan via ActiveRecord.
Den första metoden är att bara specificera :select
och :order
alternativ. Detta fungerar utmärkt när du har en ganska enkel fråga utan :joins
eller :include
.
Post.all(
:select => 'DISTINCT ON (date::date) *',
:order => 'date::date DESC, created_at DESC'
)
Om du har en mer komplex fråga där ActiveRecord genererar sin egen SELECT
kan du använda en underfråga för att välja målposter.
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'
)
Observera att detta kan vara lite långsammare än den första metoden beroende på dina data. Jag skulle bara använda den här metoden om det behövs. Se till att jämföra med produktionsliknande data.