true -6ren">
gpt4 book ai didi

ruby-on-rails - Rails after_initialize 仅在 "new"上

转载 作者:行者123 更新时间:2023-12-03 06:01:05 25 4
gpt4 key购买 nike

我有以下2个型号

class Sport < ActiveRecord::Base
has_many :charts, order: "sortWeight ASC"
has_one :product, :as => :productable
accepts_nested_attributes_for :product, :allow_destroy => true
end

class Product < ActiveRecord::Base
belongs_to :category
belongs_to :productable, :polymorphic => true
end

如果没有产品,一项运动就不可能存在,因此在我的 sports_controller.rb 中,我有:

def new
@sport = Sport.new
@sport.product = Product.new
...
end

我尝试使用 after_initialize 将产品的创建转移到运动模型:

after_initialize :create_product

def create_product
self.product = Product.new
end

我很快了解到,只要实例化模型(即通过 find 调用),就会调用 after_initialize 。所以这不是我正在寻找的行为。

我应该如何建模所有运动都有产品的要求?

谢谢

最佳答案

正如您所说,将逻辑放入 Controller 中可能是最好的答案,但您可以通过执行以下操作使 after_initialize 工作:

after_initialize :add_product

def add_product
self.product ||= Product.new
end

这样,它仅在不存在产品时设置产品。它可能不值得花费这些开销和/或不如 Controller 中的逻辑那么清晰。

编辑:根据 Ryan 的回答,从性能角度来看,以下内容可能会更好:

after_initialize :add_product

def add_product
self.product ||= Product.new if self.new_record?
end

关于ruby-on-rails - Rails after_initialize 仅在 "new"上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9610277/

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