我有三种模式:Wager,Race,RaceCard和WagerType。我在Wagers中创建了一个has_many关联,并添加了一个自定义关联方法(in_wager)。该方法的目的是为每次下注过滤正确的比赛。 (有些投注跨越多场比赛)。我希望能够做一些像Wager.first.races.in_wager这样的事情并且返回适当的比赛。
class Wager < ActiveRecord::Base
belongs_to :wager_type
belongs_to :race_card
has_many :races, :through => :race_card do
def in_wager
where('races.race_nbr BETWEEN ? AND ?', a, b)
end
end
end
如果我对a和b的值进行硬编码,我的自定义方法可以正常工作,但是,我需要这些值是动态的。具体来说,b的值应该等于Wager模型中的race_nbr属性:
b = wagers.race_nbr
并且a的值应该等于b减去特定投注类型的竞争数量(知道为Legs)加1:
a = b - Legs + 1
leg的值在WagerType模型中。注意Wagers belongs_to WagerType和WagerType has_many Wagers。因此,a可以表示为:
a = (b - (select wager_types.legs where wagers_types.id = wagers.wager_type_id) + 1)
我的问题:实际上是否可以使用我的in_wager关联方法执行此操作。我现在已经开始对这个问题进行了几个晚上的讨论,并且无法弄清楚如何为a和b分配正确的值。此外,如果你觉得我以错误的方式来到这里,我会很高兴听到其他方法。谢谢你的帮助。
注意:我从未真正提到过RaceCard或Races模型。他们有以下关联:
class RaceCard < ActiveRecord::Base
has_many :races
end
class Races < ActiveRecord::Base
belongs_to :race_card
has_many :wagers, :through => :race_card
end
更新:我昨晚在Ruby中阅读了Design Patterns并遇到了Proc。我将看看我是否可以在Association方法中使用它来计算a和b的值。
答案 0 :(得分:14)
您可以使用self.proxy_association.owner
来获取关联方法中的父对象。从那里你可以得到你想要的值。
如果我正确理解你的模型,那么代码看起来应该是这样的。
class Wager < ActiveRecord::Base
belongs_to :wager_type
belongs_to :race_card
has_many :races, :through => :race_card do
def in_wager
owner = self.proxy_association.owner
b = owner.race_nbr
a = b - owner.wager_type.legs + 1
where('races.race_nbr BETWEEN ? AND ?', a, b)
end
end
end
我从Rails api引用到Association Extensions得到了这个(proxy_association
的引用位于该部分的底部)。
答案 1 :(得分:1)
您是否绝对需要使用has_many
关系?也许你可以在Wager类中创建一个方法
def races
b = self.race_nbr
a = b + self.race_card.legs
Races.find_by_race_card_id(self.id).where('race_nbr BETWEEN ? AND ?', a, b)
end
我真的不了解你的模型,所以请求肯定是错的,但你明白了......