我不認爲有一個簡單或乾淨的方法來實現這一點,也沒有「Rails的方式」。看看例如這link
根據一個建議,在link你會做這樣的SQL請求:
SELECT h1.*
FROM highlights h1
LEFT JOIN highlights h2
ON (h1.user_id = h2.user_id
AND h1.highlight_type_id = h2.highlight_type_id
AND h1.created_at < h2.created_at)
WHERE h2.id IS NULL AND h1.user_id = <the user id you are interested in>
group by h1.highlight_type_id
我認爲這將是一些性能問題,如果你有大的表,也許,一個又何嘗不是如此很乾淨,我認爲。
否則,如果不是我會做這樣的事情,用戶這麼多亮點:
rows = {}
user.highlights.order('highlight_type_id, created_at DESC').each do |hi|
rows[hi.highlight_type_id] ||= hi
end
# then use rows which will have one object for each highlight_type_id
上created_at的DESC
是重要
編輯: 我也看到了一些建議基於此 user.highlights.group('highlight_type_id').order('created_at DESC')
這也是我第一次以爲應該解決的問題,但我測試了它,似乎沒有得到一個正確的結果 - 至少在我的測試數據。
你有沒有試過'user.highlights.group('highlight_type_id')'? – MrYoshiji
這似乎是「工作」,但我不確定它實際上在做什麼。 GROUP不會爲每個highlight_type_id返回一條記錄,但我不確定它使用什麼邏輯來選擇特定記錄。正如244an所暗示的那樣,當像user.highlights.group('highlight_type_id').order('created_at DESC')這樣的東西不能按預期工作時,因爲排序是在分組之後完成的。如果我能理解小組選擇記錄背後的邏輯,那麼我可以對這種方法更有信心。 – pejmanjohn