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



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

因此调用parent. new()将自动生成与父对象相关联的子对象。我重写了初始化器(如下所示),但是有更好的方法吗?我需要将其中一个参数传递给子对象,但我不想使用嵌套属性。这是一个API,分割应该是不可见的API用户。

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

我想这就是为什么ActiveRecord有回调:after_createafter_save

为了它的价值,我知道一个著名的开源项目名为Spree,它有产品和主变体(一个子模型:变体)作为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来保存子对象的数据。

在我看来。你不应该重写模型的initialize。您可能会在以后遇到循环依赖问题或一些随机错误。只是说. .

另一个选项可能是使用after_initialize回调:

after_initialize -> { child = Child.new(child_attributes) }

这意味着您还必须为父对象设置attr_accessor:

class Parent
  attr_accessor :child_attributes
end

这只是一种不同的方法,在我看来并没有更好。除了nested_attributes

之外,我不认为rails有任何OFTB

相关内容

  • 没有找到相关文章

最新更新