更新嵌套属性集合后是否需要调用ActiveRecord :: Base.reload?

时间:2009-12-27 23:09:03

标签: ruby-on-rails reload nested-attributes

我发现(在脚本/控制台中乱码)如果我向关联集合添加一个新项目,我不必调用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
=> []

这是正常的,还是我在关联更新中做了一些稍微错误的事情?

1 个答案:

答案 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

这绝不是一个完美的解决方案,而且在更深层次的嵌套关联中未经测试。

比以往任何时候都更好,差不多一年了!