添加到关联集合时,ActiveRecord会保存对象

时间:2011-09-21 17:56:09

标签: ruby-on-rails activerecord

来自Rails docs

  

将对象添加到集合(has_many或has_and_belongs_to_many)会自动保存该对象,除非父对象(集合的所有者)尚未存储在数据库中。

我想阻止此次保存(无论好坏)。我已经提出了三种策略,并且很想知道推荐哪种策略。

  1. 在“<<”期间阻止访问数据库。我提出了在另一个问题中如何最好地实现这一目标的问题:How can I prevent ActiveRecord from writing to the DB?。建议的解决方案似乎很可行。

  2. 利用“除非父对象尚未存储在数据库中”的警告。查看rails代码,这个条件是用new_record确定的?方法。我写了一个小方法,让一个对象认为它在一个块的持续时间内是新的。

    # model.rb
    def appear_as_new_record
      instance_eval { alias :old_new_record? :new_record? }
      instance_eval { alias :new_record? :present? }
      yield
      instance_eval { alias :new_record? :old_new_record? }
    end
    
    # used like this:
    model.appear_as_new_record do
       model.gadgets << gadget
    end
    
  3. 使用'build'方法将对象附加到集合。这就像这样(我知道这并不涵盖所有的边缘情况)

    new_gadget = model.gadgets.build(gadget.attributes)
    new_gadget.id = gadget.id
    

    这种方法有一些可怕的事情......但是,它不会通过引用进行复制。因此,如果gadget还有已加载的对象集合,则无需访问db就无法通过模型访问它们。

0 个答案:

没有答案