Rails - 检索不同的记录

时间:2013-12-11 04:34:12

标签: sql ruby-on-rails ruby-on-rails-3 postgresql distinct

我有以下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个最新但不同的用户奖励的最佳方式是什么?

2 个答案:

答案 0 :(得分:2)

def recent_awards
  awards.limit(5).recent.includes(:user).uniq
end

http://apidock.com/rails/ActiveRecord/QueryMethods/uniq

答案 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;")