O recurso do PostgreSQL que você deseja usar aqui é
DISTINCT ON
. Existem duas maneiras básicas de fazer essa consulta via ActiveRecord. O primeiro método é apenas especificar o
:select
e :order
opções. Isso funciona muito bem quando você tem uma consulta bastante simples sem :joins
ou :include
. Post.all(
:select => 'DISTINCT ON (date::date) *',
:order => 'date::date DESC, created_at DESC'
)
Se você tiver uma consulta mais complexa em que o ActiveRecord gera seu próprio
SELECT
cláusula, você pode usar uma subconsulta para selecionar os registros de destino. 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'
)
Observe que isso pode ser um pouco mais lento que o primeiro método, dependendo dos seus dados. Eu só usaria esse método se necessário. Certifique-se de fazer benchmark com dados de produção.