Из Rails Документы :
Добавление объекта в коллекцию (has_many или has_and_belongs_to_many) автоматически сохраняет этот объект, за исключением случаев, когда родительский объект (владелец коллекции)) еще не сохранен в базе данных.
Я хотел бы предотвратить сохранение (к лучшему или худшему) .Я предложил три стратегии, и мне было бы интересно узнать, какая из них рекомендована.
Блокировать доступ к БД во время «<<».Я поставил вопрос о том, как лучше всего это сделать, в другом вопросе: <a href="https://stackoverflow.com/questions/7492099/how-can-i-prevent-activerecord-from-writing-to-the-db"> Как я могу предотвратить запись ActiveRecord в БД? .Предложенное решение кажется вполне осуществимым.
Использование предостережения "за исключением случаев, когда родительский объект еще не сохранен в БД".Глядя на код рельсов, это условие определяется с помощью 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
Есть несколько страшных вещей об этом подходе ... но именно, он не будет делатькопировать по ссылке.Таким образом, если бы в гаджете уже была загружена коллекция объектов, они не были бы доступны через модель без необходимости попадания в БД.