2009-12-27 26 views
1

我發現(在腳本/控制檯noodling左右),如果我添加新項關聯集合,我沒有打電話給foo.reload看到產生的變化:更新嵌套屬性集合後,是否有必要調用ActiveRecord :: Base.reload?

foo.bars 
=> [] 
foo.bars_attributes = [{ :person_id => '288', :task_id => '1237' }] 
=> [{ :person_id=>"288", :task_id=>"1237" }] 
foo.save 
=> true 
foo.bars 
=> [#<Bar id: 6, person_id: 288, task_id => 1237>] 

不俗的表現。但是,當我從集合中刪除一個項目,我有(調用保存後可見DB)調用更改之前foo.reload體現在我的收藏:

foo.bars_attributes = [{ :id => '6', :_delete => '1' }] 
= [{ :_delete=>"1", :id=>"6" }] 
foo.save 
=> true 
foo.bars 
=> [#<Bar id: 6, person_id: 288, task_id => 1237>] 
foo.reload 
foo.bars 
=> [] 

這是正常的,還是我在關聯更新中做些微小的錯誤?

回答

0

我在rails 3.0中看到了同樣的事情(在你寫作的時候還沒有發佈)。對於需要最少數量的關聯的驗證而言,它正在受到嚴重破壞。父實例會說它是有效的,即使更新已經刪除了所有的子屬性。

我設計了一個解決方法通過在我Parent模型下面的方法的模塊,而代的是在控制器的update方法update_attributes()

def update_with_association_size_validations(attributes) 
    update_successful = false 
    self.class.transaction do 
     self.update_attributes(attributes) 
     self.reload 
     update_successful = true if self.valid? 
     raise ActiveRecord::Rollback unless update_successful 
    end 
    update_successful 
    end 

這絕不是一個完美的解決方案,它的沒有經過更深入的嵌套關聯測試。

最好讓比從來沒有,幾乎一年到一天!