【问题标题】:Should it be necessary to call ActiveRecord::Base.reload after updating a nested attribute collection?更新嵌套属性集合后是否需要调用 ActiveRecord::Base.reload?
【发布时间】:2010-12-30 08:30:01
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    我在 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
    

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

    让总比没有好,差不多一年了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-17
      • 1970-01-01
      • 2014-02-05
      相关资源
      最近更新 更多