La característica de PostgreSQL que desea usar aquí es DISTINCT ON
. Hay dos formas básicas de realizar esta consulta a través de ActiveRecord.
El primer método es simplemente especificar el :select
y :order
opciones Esto funciona muy bien cuando tiene una consulta bastante simple sin :joins
o :include
.
Post.all(
:select => 'DISTINCT ON (date::date) *',
:order => 'date::date DESC, created_at DESC'
)
Si tiene una consulta más compleja donde ActiveRecord genera su propio SELECT
cláusula, puede utilizar una subconsulta para seleccionar los 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'
)
Tenga en cuenta que esto podría ser un poco más lento que el primer método dependiendo de sus datos. Solo usaría este método si es necesario. Asegúrese de comparar con datos de producción.