gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:00:00 26 4
gpt4 key购买 nike

我有三个模型: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  

腿的值在 WagerType 模型中。注意投注属于_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 中阅读设计模式并遇到了 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 ?', a, b)
end
end
end

我从 Rails api 对 Association Extensions 的引用中得到了这个(对 proxy_association 的引用位于该部分的底部)。

关于ruby-on-rails-3 - 自定义关联方法 - 可以这样做吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8997266/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com