2010-07-30 37 views
1

我有一個模型,Foo,has_many酒吧。它有一個虛擬屬性current_baz,它返回關聯中最新Bar的baz屬性(如果存在)。我想定義Foo.current_baz =,以便可以說my_foo.update_attributes(:current_baz => 7),特別是當創建新的Foo時,我希望它可以工作。這樣,我可以說如何在父對象具有ID之前在ActiveRecord關聯上構建?

Foo.new(:current_baz => 7, ...) 

,它應該做的

self.bars.build(:baz => 7) 

。當然,這是行不通的,因爲新的Foo沒有一個id還,因此新的酒吧ISN」 t有效。我知道如何在控制器中解決這個問題,首先創建Foo,然後創建Bar並將它們封裝在一個事務中。但如果可能的話,我真的很想在模型中保留這個邏輯。看來幾乎可以。有沒有人有什麼建議?

回答

1

有幾個方法可以做到這一點,但我在過去所做的那樣(特別是如果你可以依靠那裏只有一個新的酒吧對象每次一個方法是使一個實例變量的未保存。酒吧,裏面FOO那麼,勾畫說出來,你會說:

if self.new? 
    @new_bar = bar.new 
    @new_bar.baz = new_current_baz_value 
else 
    self.bars.build(:baz => 7) 
end 

然後,添加一個after_save的處理,說

if @new_bar 
    @new_bar.foo = self 
    @new_bar.save 
    @new_bar = nil 
end 

然後,最後,當你調用current_baz,您需要測試new_bar的存在性,如下所示:

if @new_bar 
    return @new_bar.baz 
else 
    return self.bars.last.baz 
end 

這是否有意義?

+0

完美的感覺,謝謝! – korinthe 2010-07-31 15:13:52

相關問題