Tôi đã trúng một khối nhẹ với scope
phương pháp mới (Arel 0.4.0, Rails 3.0.0.rc)Rails Arel chọn cột riêng biệt
Về cơ bản tôi có:
Một mô hình topics
, mà has_many :comments
và kiểu comments
(có cột topic_id
) belongs_to :topics
.
Tôi đang cố tìm nạp bộ sưu tập "Chủ đề nóng", tức là các chủ đề được nhận xét gần đây nhất. mã hiện như sau:
# models/comment.rb
scope :recent, order("comments.created_at DESC")
# models/topic.rb
scope :hot, joins(:comments) & Comment.recent & limit(5)
Nếu tôi thực hiện Topic.hot.to_sql
, các truy vấn sau đây là bắn:
SELECT "topics".* FROM "topics" INNER JOIN "comments"
ON "comments"."topic_id" = "topics"."id"
ORDER BY comments.created_at DESC LIMIT 5
này hoạt động tốt, nhưng nó có khả năng trả về chủ đề trùng lặp - Nếu chủ đề # 3 gần đây đã nhận xét về nhiều lần, nó sẽ được trả lại nhiều lần.
Câu hỏi của tôi
Làm thế nào tôi sẽ đi về trả lại một bộ riêng biệt của chủ đề, mang trong tâm trí mà tôi vẫn cần phải truy cập vào các lĩnh vực comments.created_at
, để hiển thị trước các bài trước là bao lâu? Tôi sẽ tưởng tượng một cái gì đó dọc theo các dòng của distinct
hoặc group_by
, nhưng tôi không quá chắc chắn cách tốt nhất để đi về nó.
Bất kỳ lời khuyên/đề xuất nào được đánh giá cao - tôi đã thêm 100 tiền thưởng đại diện với hy vọng sớm có giải pháp thanh lịch.
Cảm ơn câu trả lời của bạn - đó là giải pháp, nhưng tôi thực sự chỉ tìm kiếm giải pháp sử dụng Rails3/Arel 'scope'! – Jeriko
Cập nhật câu trả lời của tôi, hãy xem. –
Tôi chấp nhận câu trả lời này và trao tiền thưởng cho bạn - Nó không trả lời câu hỏi ban đầu của tôi, nhưng nó thực sự hoạt động tốt hơn theo cách này. Cảm ơn :) – Jeriko