在Rails ActiveRecord模型中创建父级时创建子对象的当前最佳实践是什么?

时间:2014-03-12 11:12:07

标签: ruby-on-rails ruby activerecord initialization

我想在创建父实例的任何时候创建子对象。

因此,调用Parent.new()将自动生成与父对象关联的子对象。我重写初始化程序(如下所示),但有更好的方法吗?我需要将其中一个参数传递给子对象,但我不想使用嵌套属性。它适用于API,并且对于API用户来说,拆分应该是不可见的。

has_one :child
validates_associated :child

def initializer(args*)
   @child = Child.new(args[:some_argument])
   super
end

2 个答案:

答案 0 :(得分:2)

我认为这就是为什么ActiveRecord的回调类似于:after_createafter_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

之外,我不认为rails对于这种情况有任何OFTB