Tính năng PostgreSQL bạn muốn sử dụng ở đây là DISTINCT ON
. Có hai cách cơ bản để thực hiện truy vấn này qua ActiveRecord.
Phương pháp đầu tiên là chỉ cần chỉ định :select
và :order
tùy chọn. Điều này hoạt động hiệu quả khi bạn có một truy vấn khá đơn giản không có :joins
hoặc :include
.
Post.all(
:select => 'DISTINCT ON (date::date) *',
:order => 'date::date DESC, created_at DESC'
)
Nếu bạn có một truy vấn phức tạp hơn trong đó ActiveRecord tạo SELECT
của riêng nó , bạn có thể sử dụng một truy vấn con để chọn các bản ghi đích.
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'
)
Lưu ý rằng điều này có thể chậm hơn một chút so với phương pháp đầu tiên tùy thuộc vào dữ liệu của bạn. Tôi sẽ chỉ sử dụng phương pháp này nếu được yêu cầu. Đảm bảo đánh giá chuẩn với dữ liệu giống sản xuất.