Fitur PostgreSQL yang ingin Anda gunakan di sini adalah DISTINCT ON
. Ada dua cara dasar untuk membuat kueri ini melalui ActiveRecord.
Metode pertama adalah dengan menentukan :select
dan :order
pilihan. Ini berfungsi dengan baik ketika Anda memiliki kueri yang cukup sederhana tanpa :joins
atau :include
.
Post.all(
:select => 'DISTINCT ON (date::date) *',
:order => 'date::date DESC, created_at DESC'
)
Jika Anda memiliki kueri yang lebih kompleks di mana ActiveRecord menghasilkan SELECT
-nya sendiri klausa, Anda dapat menggunakan subquery untuk memilih catatan target.
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'
)
Perhatikan bahwa ini bisa menjadi sedikit lebih lambat daripada metode pertama tergantung pada data Anda. Saya hanya akan menggunakan metode ini jika diperlukan. Pastikan untuk melakukan benchmark dengan data seperti produksi.