Функцията на PostgreSQL, която искате да използвате тук, е DISTINCT ON
. Има два основни начина да направите тази заявка чрез ActiveRecord.
Първият метод е просто да посочите :select
и :order
настроики. Това работи чудесно, когато имате доста проста заявка без :joins
или :include
.
Post.all(
:select => 'DISTINCT ON (date::date) *',
:order => 'date::date DESC, created_at DESC'
)
Ако имате по-сложна заявка, при която ActiveRecord генерира свой собствен SELECT
клауза, можете да използвате подзаявка, за да изберете целевите записи.
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'
)
Имайте предвид, че това може да е малко по-бавно от първия метод в зависимост от вашите данни. Бих използвал този метод само ако е необходимо. Не забравяйте да сравните с данни, подобни на производствени.