Funkcja PostgreSQL, której chcesz tutaj użyć, to DISTINCT ON
. Istnieją dwa podstawowe sposoby wykonania tego zapytania przez ActiveRecord.
Pierwsza metoda to po prostu określenie :select
i :order
opcje. Działa to świetnie, gdy masz dość proste zapytanie bez :joins
lub :include
.
Post.all(
:select => 'DISTINCT ON (date::date) *',
:order => 'date::date DESC, created_at DESC'
)
Jeśli masz bardziej złożone zapytanie, w którym ActiveRecord generuje własny SELECT
klauzula, możesz użyć podzapytania, aby wybrać rekordy docelowe.
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'
)
Pamiętaj, że może to być nieco wolniejsze niż pierwsza metoda, w zależności od twoich danych. Używałbym tej metody tylko w razie potrzeby. Pamiętaj, aby przeprowadzić test porównawczy z danymi podobnymi do produkcji.