我想在创建父实例的任何时候创建子对象。
因此,调用Parent.new()将自动生成与父对象关联的子对象。我重写初始化程序(如下所示),但有更好的方法吗?我需要将其中一个参数传递给子对象,但我不想使用嵌套属性。它适用于API,并且对于API用户来说,拆分应该是不可见的。
has_one :child
validates_associated :child
def initializer(args*)
@child = Child.new(args[:some_argument])
super
end
答案 0 :(得分:2)
我认为这就是为什么ActiveRecord的回调类似于:after_create
和after_save
。
值得我知道的是一个名为 Spree 的着名开源项目,它具有产品和主变量(子模型:Variant)作为Product
对象的依赖项
以下是代码:https://github.com/spree/spree/blob/master/core/app/models/spree/product.rb#L236-L250
和:https://github.com/spree/spree/blob/master/core/app/models/spree/product.rb#L87
您可以after_create
保存子对象数据。
而且,在我看来。你不应该重写模型的初始化。您最终可能会遇到循环依赖问题或一些随机错误。只是说...
答案 1 :(得分:1)
另一种选择可能是使用after_initialize
回调:
after_initialize -> { child = Child.new(child_attributes) }
这意味着您还必须为父对象设置attr_accessor:
class Parent
attr_accessor :child_attributes
end
这只是一种不同的方法,对我来说看起来并不好看。除了nested_attributes