La fonctionnalité PostgreSQL que vous souhaitez utiliser ici est DISTINCT ON
. Il existe deux méthodes de base pour effectuer cette requête via ActiveRecord.
La première méthode consiste simplement à spécifier le :select
et :order
options. Cela fonctionne très bien lorsque vous avez une requête assez simple sans :joins
ou :include
.
Post.all(
:select => 'DISTINCT ON (date::date) *',
:order => 'date::date DESC, created_at DESC'
)
Si vous avez une requête plus complexe où ActiveRecord génère son propre SELECT
clause, vous pouvez utiliser une sous-requête pour sélectionner les enregistrements cibles.
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'
)
Notez que cela pourrait être un peu plus lent que la première méthode en fonction de vos données. Je n'utiliserais cette méthode que si nécessaire. Assurez-vous de comparer avec des données de production.