Ruby on rails 3 自定义关联方法-可以这样做吗

Ruby on rails 3 自定义关联方法-可以这样做吗,ruby-on-rails-3,activerecord,associations,Ruby On Rails 3,Activerecord,Associations,我有三种型号:赌卡、赛马卡、赛马卡和赌卡。我已经在下注中创建了多个关联,并添加了一个自定义关联方法(在下注中)。该方法的目的是为每次下注筛选正确的比赛。(一些赌注跨越多场比赛)。我希望能够做一些事情,如:下注。第一。比赛。在下注,并有适当的比赛返回 class Wager < ActiveRecord::Base belongs_to :wager_type belongs_to :race_card has_many :races, :through => :race_

我有三种型号:赌卡、赛马卡、赛马卡和赌卡。我已经在下注中创建了多个关联,并添加了一个自定义关联方法(在下注中)。该方法的目的是为每次下注筛选正确的比赛。(一些赌注跨越多场比赛)。我希望能够做一些事情,如:下注。第一。比赛。在下注,并有适当的比赛返回

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减去特定下注类型(称为腿)的比赛次数加1:

legs的值在WagerType模型中。注:下注属于WagerType,并且WagerType有许多下注。因此,a可以表示为:

a = (b - (select wager_types.legs where wagers_types.id = wagers.wager_type_id) + 1)
我的问题是:用我的赌注关联方法真的可以做到这一点吗。我已经在这个问题上绞尽脑汁好几个晚上了,不知道如何给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
class RaceCard:比赛\u卡
结束

更新:昨晚我在阅读Ruby中的设计模式,偶然发现了这个过程。我要看看是否可以在关联方法中使用它来计算a和b的值

你真的需要使用一个有很多关系的
?也许你可以在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 

我不太了解您的模型,所以请求肯定是错误的,但您知道了…

您可以使用
self.proxy\u 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
类赌注:比赛
下注
所有者=self.proxy\u association.owner
b=所有者。种族\u nbr
a=b-所有者.赌注类型.腿数+1
其中('races.race_nbr在?和?'之间),a,b)
结束
结束
结束

这是我从Rails api参考中获得的(参考
proxy\u association
位于本节底部)。

感谢您的输入。这是可行的,但它不符合我的应用要求。Azolo-谢谢!这就成功了。就在他晚上,我试着在协会中使用self。我只是不知道proxy_association.owner。今晚我一定会读更多关于它的文章。再次感谢。
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 
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