我发现(在脚本/控制台中乱码)如果我向关联集合添加一个新项目,我不必调用foo.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>]
的Terrific。但是当我从集合中删除一个项目时,我必须在更改之前调用foo.reload(在调用save之后在DB中可见)会反映在我的集合中:
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 :(得分:0)
我在rails 3.0中看到了同样的东西(在你写作时尚未发布)。它正在通过需要最少数量关联的验证来收获破坏。即使在更新删除了所有子属性之后,父实例也会说它是有效的。
我设计了一种解决方法,在我的Parent
模型中使用以下方法包含一个模块,并在控制器的update_attributes()
方法中用update
替换它:
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
这绝不是一个完美的解决方案,而且在更深层次的嵌套关联中未经测试。
比以往任何时候都更好,差不多一年了!