默认创建导轨中的HAS_ONE依赖性



我想了解在铁轨中创建模型依赖性的最佳实践。场景很简单。这两个模型是:

class Main < ActiveRecord::Base 
    has_one :dependent
    validates :dependent, presence: true
end
class Dependent < ActiveRecord::Base 
end

(请注意,我想验证以确保依赖始终存在)

每当创建Main对象时,我都希望创建一个Dependent对象并"默认初始化"。我来自C 的背景,因此,我将此问题视为构造成员变量的一个,其类型是某些具有默认构造函数的class

我有多种方法可以解决这个问题。

  1. 将逻辑放在before_validation中创建Dependent

这感觉非常"无路"。我想在before_create中执行此操作,但是在回调之前进行了验证。在before_validation中进行操作很丑陋,因为此回调在更新上的Create 上都调用,这使逻辑棘手/混乱。

  1. 将逻辑放入.new

这感觉非常非常" un-railsy",在概念上可能是错误的。我将new视为在构建模型之前发生的ActiveRecord结构。

  1. 让来电者做工作

每当创建Main对象时,都必须通过new-save而不是create完成。然后,调用代码必须创建Dependent本身,尽管具有默认值,例如

Main.new do |m|
    m.dependent = Dependent.create
end

这对呼叫者来说是烦人的负担,并导致许多重复的代码。我可以将其包装到工厂类型的方法中,但是存在相同的问题,即调用代码需要进行一些腿部工作。

有规范的解决方案吗?

您应该尝试使用after_create回调并在此方法中创建因实例。

要回答我自己的问题,我找到了一个我从未看到的回调:after_initialize。我可以在这里做我想做的事。

给他人的注释:

我的特殊情况非常简单,因为我一直希望我的因类默认初始化用户不需要设置任何东西。但是,在更复杂的情况下,这将行不通,初始化受抚养人可能需要:

  1. 在创建站点的明确初始化
  2. 用户使用#accepts_nested_attributes_for
  3. 初始化依赖者

相关内容

最新更新