2012-01-15 46 views
0

我有三种模型:RaceCards,Races和Wagers。如何将动态条件应用于Rails 3 has_many:通过关联

class RaceCard < ActiveRecord::Base 
has_many :races 
has_many :wagers 
end 

class Race < ActiveRecord::Base 
belongs_to :race_card 
has_many :wagers, :through => :race_card 
end 

class Wager < ActiveRecord::Base 
belongs_to :race_card 
has_many :races, :through => :race_card 
end 

rails g model RaceCard race_card_date:date number_of_race:integer 

rails g model Race race_card_id:integer race_nbr:integer 

rails g model Wager race_nbr:integer race_card_id:integer wager_type:string payoff:integer 

所以,如果我这样做控制台:

Wager.first.races #All races on the race card are returned. Good! 

但我想确定返回什么种族的一种方式,所以我加一个条件:

if I add this: :condition =>{:race_nbr => 1} 

Wager.first.races #Return just race 1, but this is static (always set to 1) 

我的问题是如何我是否将条件设置为下注模式中的race_nbr:

:condition => {:race_nbr => wager.race_nbr} #throws an error 
:condition => {:race_nbr => self.race_nbr} #throws an error 

我已经尝试了很多其他的东西,只是似乎无法得到它。任何指导将不胜感激。提前致谢。

更新:我现在已经试过下面

:condition => "wagers.race_nbr = races.race_nbr" #unfortunately this yields the following: 

SQL error or missing database (no such column wagers.race_nbr) 

回答

1

由PinnyM建议的解决方案可以做到这一点使用范围:

def Race < ActiveRecord::Base 
    scope :for_race_nbr, lambda { |race_nbr| where(:race_nbr => race_nbr) } 
end 

def Wager < ActiveRecord::Base 
    def races_for_race_nbr 
    races.for_race_nbr(race_nbr) 
    end 
end 
+0

我希望把状态协会内。请问这样的工作::condition => {wager_nbr => races.race_nbr} – Mutuelinvestor 2012-01-15 03:53:18

+0

差不多,请参阅上面编辑的答案 – PinnyM 2012-01-15 04:02:36

+0

我认为我们有它,但是当我在控制台尝试时,我得到以下内容:下注负载(0.0ms)选择“下注”*从“下注”下注“下注”“下注”= 1极限1 比赛负荷(2.0ms)选择“比赛”*从“比赛”内部加入“比赛卡” SQL_ERROR:[SQLITE_ERROR] SQL错误或缺少数据库(没有这样的列:下注:下划线):“race_card_id”=“race_cards”。“id”WHERE“race_cards”。“id”= 1 AND(races.race_nbr = wagers.race_nbr) ActiveRecord :: JDBCError: .race_nbr)。它看起来像我需要得到Wager添加到联接。 – Mutuelinvestor 2012-01-15 04:34:35