来自Rails docs:
将对象添加到集合(has_many或has_and_belongs_to_many)会自动保存该对象,除非父对象(集合的所有者)尚未存储在数据库中。
我想阻止此次保存(无论好坏)。我已经提出了三种策略,并且很想知道推荐哪种策略。
在“<<”期间阻止访问数据库。我提出了在另一个问题中如何最好地实现这一目标的问题:How can I prevent ActiveRecord from writing to the DB?。建议的解决方案似乎很可行。
利用“除非父对象尚未存储在数据库中”的警告。查看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
使用'build'方法将对象附加到集合。这就像这样(我知道这并不涵盖所有的边缘情况)
new_gadget = model.gadgets.build(gadget.attributes)
new_gadget.id = gadget.id
这种方法有一些可怕的事情......但是,它不会通过引用进行复制。因此,如果gadget还有已加载的对象集合,则无需访问db就无法通过模型访问它们。