La funzione PostgreSQL che desideri utilizzare qui è DISTINCT ON
. Esistono due modi di base per eseguire questa query tramite ActiveRecord.
Il primo metodo è semplicemente specificare il :select
e :order
opzioni. Funziona benissimo quando hai una query abbastanza semplice senza :joins
o :include
.
Post.all(
:select => 'DISTINCT ON (date::date) *',
:order => 'date::date DESC, created_at DESC'
)
Se hai una query più complessa in cui ActiveRecord genera il proprio SELECT
clausola, puoi utilizzare una sottoquery per selezionare i record di destinazione.
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'
)
Nota che questo potrebbe essere un po' più lento del primo metodo a seconda dei tuoi dati. Userei questo metodo solo se necessario. Assicurati di eseguire il benchmark con dati simili alla produzione.