代码之家  ›  专栏  ›  技术社区  ›  Wolfram Arnold

ActiveRecord已更改?标志不报告关联子项中的更改

  •  2
  • Wolfram Arnold  · 技术社区  · 15 年前

    ActiveRecord有以下情况(在Rails 2.3.8中):

    class Order < ActiveRecord::Base
      has_many :documents
      accepts_nested_attributes_for :documents
    end
    
    class Document <ActiveRecord::Base
      belongs_to :order
    end
    

    现在,在一个控制器中,我想根据用户是否对现有记录进行了更改来对其进行不同的指导。

    @order.attributes = params[:order]
    if @order.changed?
      # save order
      # redirect one place
    else
      # redirect another place
    end
    

    为此我想用换过的?旗帜。事实证明@订单。更改了吗?不查询子级。

    我试着通过has\u many:documents关联上的关联代理方法来实现,如下所示:

      has_many :documents do
        def changed?
          any? {|doc| doc.changed?}
        end
      end
    

    但这有一个意外的副作用,即它从磁盘加载相关文档,这显然会消除在中的嵌套属性赋值中所做的任何更改@订单.属性=params[:order]这在Rails中似乎是一个有意的设计决策,但是如何解决它呢?还是功能上的差距?

    思想?

    1 回复  |  直到 15 年前
        1
  •  4
  •   hellvinz    15 年前

    你可以看看 nested_records_changed_for_autosave .

    这并不完全是你想要的,但它有关于如何做到这一点的线索。尤其是 association_instance_get which“如果响应:loaded,则获取指定的关联实例?,否则为零。”