Funkce PostgreSQL, kterou zde chcete použít, je DISTINCT ON
. Existují dva základní způsoby, jak provést tento dotaz prostřednictvím ActiveRecord.
První metodou je pouze zadat :select
a :order
možnosti. Funguje to skvěle, když máte poměrně jednoduchý dotaz bez :joins
nebo :include
.
Post.all(
:select => 'DISTINCT ON (date::date) *',
:order => 'date::date DESC, created_at DESC'
)
Pokud máte složitější dotaz, kde ActiveRecord generuje svůj vlastní SELECT
klauzule, můžete k výběru cílových záznamů použít poddotaz.
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'
)
Všimněte si, že to může být o něco pomalejší než první metoda v závislosti na vašich datech. Tuto metodu bych použil pouze v případě potřeby. Ujistěte se, že srovnáváte s daty podobnými produkci.