Rails Association问题

时间:2010-03-20 15:42:11

标签: ruby-on-rails associations

我有三种模式:User,RaceWeek,Race。

目前的协会:

class User < ActiveRecord::Base
  has_many :race_weeks
end

class RaceWeek < ActiveRecord::Base
  belongs_to :user
  has_many :races
end

class Race < ActiveRecord::Base
  belongs_to :race_week
end

因此user_id是RaceWeek中的外键,而race_week_id是Race中的外键。

fastest_time是Race模型的一个属性。

问题:检索具有最快X竞赛时间的用户列表的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

类似的东西:

 races = Race.all(:order => "fastest_time desc", :limit => X, :include => {:race_week => :user})
 users = races.map{|race| race.race_week.user}.uniq

注意:没有测试过。

答案 1 :(得分:1)

鉴于您当前的模型,以下内容应该有效。

race_weeks = RaceWeek.find_by_sql(["SELECT user_id FROM race_weeks JOIN races ON races.race_week_id = race_weeks.id ORDER BY races.fastest_time desc LIMIT ?", X)
users = User.find(race_weeks.collect(&:user_id).uniq)

我知道它需要两次查找,但第二次查找应该非常快,因为你只是按主键查找X记录。

答案 2 :(得分:1)

你可以这样做:

users = User.all(:limit => X, :joins => {:race_weeks => :races}, :order => "reces.fastest_time DESC").uniq

如果您已正确指定has_many :through关联,那么您甚至可以这样做:

users = User.all(:limit => X, :joins => :races, :order => "reces.fastest_time DESC").uniq

在此解决方案中,您可以通过一个查询获得所需内容,但只有两个连接。除非你使用小X,否则这个uniq方法不是很好。