gpt4 book ai didi

ruby-on-rails - after_initialize 中 Rails 关联 nil

转载 作者:行者123 更新时间:2023-12-03 00:52:07 25 4
gpt4 key购买 nike

我有两个具有一对多关联的模型。我想在初始化时根据父模型的某些状态在子模型上设置默认值。这涉及到在需要通过belongs_to关联访问父级的子级上触发after_initialize回调。问题是,当我使用 build 方法实例化子级时,after_initialize 回调中与父级的关联为零。这是预期的行为吗?我使用的是 Rails 3.0.6

一个玩具示例:

class Merchant < ActiveRecord::Base
has_many :products
end

class Product < ActiveRecord::Base
belongs_to :merchant

after_initialize :set_default_value

def set_default_value
if merchant.state
self.foo = some_value
else
self.foo = some_other_value
end
end
end

在 Controller 中:

product = merchant.products.build

在对 set_default_value 的调用中,商家为零,尽管看起来不应该如此。

最佳答案

我将更改代码如下:

class Product < ActiveRecord::Base
...
def set_default_value(state = merchant.state)
if state
self.foo = some_value
else
self.foo = some_other_value
end
end
end

然后将您的调用者更改为:

product = merchant.products.build(:state => merchant.state)

此外,我发现 after_initialize 回调很慢。因此,另一种选择是将逻辑移至产品的构建器中。

product = merchant.products.build(:foo => merchant.state ? some_value : some_other_value)

这也消除了代码中违反德米特定律的情况(即产品不应该知道/关心商家的状态)。

关于ruby-on-rails - after_initialize 中 Rails 关联 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10864680/

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