Ruby on rails 3 如何通过关联将动态条件应用到Rails 3中
我有三种型号:赛马卡、赛马和赌博Ruby on rails 3 如何通过关联将动态条件应用到Rails 3中,ruby-on-rails-3,associations,Ruby On Rails 3,Associations,我有三种型号:赛马卡、赛马和赌博 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 :ra
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
但是我想要一种确定返回哪些比赛的方法,所以我添加了一个条件:
if I add this: :condition =>{:race_nbr => 1}
Wager.first.races #Return just race 1, but this is static (always set to 1)
我的问题是如何在下注模式中设置比赛条件:
:condition => {:race_nbr => wager.race_nbr} #throws an error
:condition => {:race_nbr => self.race_nbr} #throws an error
我试过很多其他的方法,但似乎都没能成功。任何指导都将不胜感激。提前谢谢
更新:我现在已经尝试了下面PinnyM建议的解决方案
:condition => "wagers.race_nbr = races.race_nbr" #unfortunately this yields the following:
SQL error or missing database (no such column wagers.race_nbr)
可以使用作用域执行此操作:
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
def Race种族| nbr)}
结束
def下注
我希望将条件放入关联中。我想我们已经做到了,但当我在控制台中尝试时,我得到了以下结果:下注量(0.0ms)选择“下注”。*从“下注”的“下注”中选择“下注”。“id”=1个限制1个比赛负载(2.0ms)选择“比赛”。*从“比赛”中选择“比赛”。“比赛卡”=比赛卡。“id”中的“race\u cards”。“id”=1和(races.race\u nbr=wagers.race\u nbr)ActiveRecord::JDBCError:[SQLITE\u ERROR]SQL错误或缺少数据库(没有这样的列:wagers.race\u nbr)。看起来我需要将赌注添加到加入中。你是对的,我错误地认为加入是在一个步骤中完成的。不幸的是,外部加入不允许在像:has\u many这样的关联上进行。我认为你必须使用作用域,请参阅答案(再次编辑)。信不信由你,此方法产生的错误与早期方法完全相同。此处的连接也分为多个步骤。首先,它查询下注并获取第一条记录,然后它对比赛和比赛卡进行内部连接,但无法解析where子句中的wager.race_nbr引用。有趣的是,不应该有r参考wagers.race\u nbr,因为代码不包含任何内容。是否确实已删除:conditions修饰符并重新启动控制台环境?
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