我想了解在铁轨中创建模型依赖性的最佳实践。场景很简单。这两个模型是:
class Main < ActiveRecord::Base
has_one :dependent
validates :dependent, presence: true
end
class Dependent < ActiveRecord::Base
end
(请注意,我想验证以确保依赖始终存在)
每当创建Main
对象时,我都希望创建一个Dependent
对象并"默认初始化"。我来自C 的背景,因此,我将此问题视为构造成员变量的一个,其类型是某些具有默认构造函数的class
。
我有多种方法可以解决这个问题。
- 将逻辑放在
before_validation
中创建Dependent
。
这感觉非常"无路"。我想在before_create
中执行此操作,但是在回调之前进行了验证。在before_validation
中进行操作很丑陋,因为此回调在更新上的Create 和上都调用,这使逻辑棘手/混乱。
- 将逻辑放入
.new
这感觉非常非常" un-railsy",在概念上可能是错误的。我将new
视为在构建模型之前发生的ActiveRecord
结构。
- 让来电者做工作
每当创建Main
对象时,都必须通过new-save
而不是create
完成。然后,调用代码必须创建Dependent
本身,尽管具有默认值,例如
Main.new do |m|
m.dependent = Dependent.create
end
这对呼叫者来说是烦人的负担,并导致许多重复的代码。我可以将其包装到工厂类型的方法中,但是存在相同的问题,即调用代码需要进行一些腿部工作。
有规范的解决方案吗?
您应该尝试使用after_create
回调并在此方法中创建因实例。
要回答我自己的问题,我找到了一个我从未看到的回调:after_initialize
。我可以在这里做我想做的事。
给他人的注释:
我的特殊情况非常简单,因为我一直希望我的因类默认初始化和用户不需要设置任何东西。但是,在更复杂的情况下,这将行不通,初始化受抚养人可能需要:
- 在创建站点的明确初始化
- 用户使用
#accepts_nested_attributes_for
初始化依赖者