2010-07-05 86 views
2

这可以通过示例来最好地解释。以下是简单的事:用has_many关联预先填充创建Rails模型的实例

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>] 

不过,我想所有的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>] 

这可能吗?理想情况下,'default'对象仍将以与我明确运行第2a行相同的方式关联,以便在保存父Foo对象时保存它。

回答

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

从概念上来说,这不是最干净的这样做的方式,因为您正在将模型逻辑混合到另一个模型逻辑中。

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

记住,如果你需要保存关联对象,你可以在控制器或使用嵌套模型做它形成

什么是你需要实现的任务呢?

相关问题