我有三种模式: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竞赛时间的用户列表的最佳方法是什么?
答案 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
方法不是很好。