加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails-3 – 自定义关联方法 – 可以做到这一点

发布时间:2020-12-17 04:05:32 所属栏目:百科 来源:网络整理
导读:我有三个模型:Wager,Race,RaceCard和WagerType.我在Wagers中创建了一个has_many关联,并添加了一个自定义关联方法(in_wager).该方法的目的是为每次下注过滤正确的比赛. (有些投注跨越多场比赛).我希望能够做一些像Wager.first.races.in_wager这样的事情并且
我有三个模型: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的值.

解决方法

您可以使用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 ?',b)
    end
  end
end

我从Rails api引用到Association Extensions得到了这个(对于proxy_association的引用在本节的底部).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读