我有以下has_many和belongs_to关系:
class Trophy < ActiveRecord::Base
has_many :awards
end
class Award < ActiveRecord::Base
belongs_to :trophy
end
奖励模型有user_id
字段和trophy_id
字段。
对于一个奖杯的实例,我想要返回5个最近但却截然不同的用户奖励。
我能做到:
def recent_awards
trophy_awards = awards.recent.includes(:user)
trophy_awards.uniq! {|a| a.user_id}
trophy_awards[0...4]
end
但是,它效率不高,因为我正在处理很多记录。
目前,我正在这样做:
def recent_awards
trophy_awards = awards.limit(50).recent.includes(:user)
trophy_awards.uniq! {|a| a.user_id}
trophy_awards[0...4]
end
问题是,如果最后48个奖项是针对同一个用户,则不会给我5个不同的用户奖励。
返回5个最新但不同的用户奖励的最佳方式是什么?
答案 0 :(得分:2)
def recent_awards
awards.limit(5).recent.includes(:user).uniq
end
答案 1 :(得分:0)
试试这个:
Award.find_by_sql("SELECT *
FROM awards a1 INNER JOIN (
SELECT MAX(created_at) AS recent
FROM awards
GROUP BY user_id) a2
ON (a1.created_at = a2.recent)
ORDER BY a1.created_at DESC
LIMIT 5;")