De PostgreSQL-functie die u hier wilt gebruiken, is DISTINCT ON
. Er zijn twee basismanieren om deze query te maken via ActiveRecord.
De eerste methode is om gewoon de :select
. te specificeren en :order
opties. Dit werkt prima als je een vrij eenvoudige vraag hebt zonder :joins
of :include
.
Post.all(
:select => 'DISTINCT ON (date::date) *',
:order => 'date::date DESC, created_at DESC'
)
Als u een complexere query heeft waarbij ActiveRecord zijn eigen SELECT
. genereert clausule, kunt u een subquery gebruiken om de doelrecords te selecteren.
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'
)
Houd er rekening mee dat dit een stuk langzamer kan zijn dan de eerste methode, afhankelijk van uw gegevens. Ik zou deze methode alleen gebruiken als dat nodig is. Zorg ervoor dat u benchmarkt met productie-achtige gegevens.