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