PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Elegante gruppo PostgreSQL di Ruby on Rails / ActiveRecord

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.