1

我发现(在脚本/控制台中闲逛)如果我将新项目添加到关联的集合中,我不必调用 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>]

了不起。但是当我从集合中删除一个项目时,我必须在更改(调用保存后在 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
=> []

这是正常的,还是我在关联更新中做错了什么?

4

1 回答 1

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

这绝不是一个完美的解决方案,而且它还没有在更深层次的嵌套关联上进行测试。

让总比不让,快一年了!

于 2010-12-21T23:48:51.000 回答