最好通过示例解释。以下是很简单的事:
class Foo < ActiveRecord::Base
has_many :bars
end
1a>> foo = Foo.new
=> #<Foo id: nil>
2a>> foo.bars << Bar.new
=> [#<Bar id: nil, foo_id: nil>]
3a>> foo.bars
=> [#<Bar id: nil, foo_id: nil>]
但是,我想要使用Bar初始化所有Foo对象,而不必明确地运行第2行:
class Foo < ActiveRecord::Base
has_many :bars
# [...] Some code here
end
1b>> foo = Foo.new
=> #<Foo id: nil>
2b>> foo.bars
=> [#<Bar id: nil, foo_id: nil>]
这可能吗?理想情况下,“默认”对象仍将以与显式运行第2a行相同的方式关联,以便在保存父Foo对象时保存它。
答案 0 :(得分:2)
让我先说一下,从设计的角度来看,这可能不是最好的主意。假设您的代码比Foo和Bar复杂得多,您可能会更倾向于builder.
但是,如果你坚持做你所要求的,那就可以做到。
class Foo < ActiveRecord::Base
has_many :bars
def after_initialize
self.bars << Bar.new if self.new_record?
end
end
答案 1 :(得分:1)
从概念上讲,这不是最干净的做这样的事情的方式,因为你将模型逻辑混合在另一个模型中。
还有更多:在初始化期间你还没有任何实例,所以我认为这是不可能的。
请记住,如果您需要保存关联对象,可以在控制器中或使用嵌套模型表单
你需要完成的任务是什么?