2010-07-05 75 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

從概念上來說,這不是最乾淨的這樣做的方式,因爲您正在將模型邏輯混合到另一個模型邏輯中。

還有更多:您在初始化期間還沒有任何實例,所以我認爲這是不可能的。

記住,如果你需要保存關聯對象,你可以在控制器或使用嵌套模型做它形成

什麼是你需要實現的任務呢?