【问题标题】:What's the current best practice for creating child objects on creation of the parent in Rails ActiveRecord models?在 Rails ActiveRecord 模型中创建父对象时创建子对象的当前最佳实践是什么?
【发布时间】:2014-03-12 19:34:31
【问题描述】:

我想在创建父对象的任何时候创建一个子对象。

因此调用 Parent.new() 将自动生成一个与父对象关联的子对象。我覆盖了初始化程序(如下所示),但有更好的方法吗?我需要将参数之一传递给子对象,但我不想使用嵌套属性。它适用于 API,API 用户应该看不到拆分。

has_one :child
validates_associated :child

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

【问题讨论】:

  • 鉴于这个问题是开放式的,不一定有一个正确的答案。因此,我将我认为最有用的一个标记为正确。

标签: ruby-on-rails ruby activerecord initialization


【解决方案1】:

我认为这就是 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 来保存子对象数据。

而且,在我看来。您不应该覆盖模型的初始化。您可能会在以后遇到循环依赖问题或一些随机错误。只是说..

【讨论】:

    【解决方案2】:

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

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

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

    class Parent
      attr_accessor :child_attributes
    end
    

    这只是一种不同的方法,对我来说看起来并不好。除了nested_attributes

    ,我认为 Rails 对这种情况没有任何 OFTB

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      相关资源
      最近更新 更多