使用has_many关联预填充创建Rails模型的实例

时间:2010-07-05 16:36:36

标签: ruby-on-rails activerecord has-many

最好通过示例解释。以下是很简单的事:

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对象时保存它。

2 个答案:

答案 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)

从概念上讲,这不是最干净的做这样的事情的方式,因为你将模型逻辑混合在另一个模型中。

还有更多:在初始化期间你还没有任何实例,所以我认为这是不可能的。

请记住,如果您需要保存关联对象,可以在控制器中或使用嵌套模型表单

你需要完成的任务是什么?