ActiveRecord сохраняет объект при добавлении в коллекцию ассоциаций - PullRequest
1 голос
/ 21 сентября 2011

Из Rails Документы :

Добавление объекта в коллекцию (has_many или has_and_belongs_to_many) автоматически сохраняет этот объект, за исключением случаев, когда родительский объект (владелец коллекции)) еще не сохранен в базе данных.

Я хотел бы предотвратить сохранение (к лучшему или худшему) .Я предложил три стратегии, и мне было бы интересно узнать, какая из них рекомендована.

  1. Блокировать доступ к БД во время «<<».Я поставил вопрос о том, как лучше всего это сделать, в другом вопросе: <a href="https://stackoverflow.com/questions/7492099/how-can-i-prevent-activerecord-from-writing-to-the-db"> Как я могу предотвратить запись ActiveRecord в БД? .Предложенное решение кажется вполне осуществимым.

  2. Использование предостережения "за исключением случаев, когда родительский объект еще не сохранен в БД".Глядя на код рельсов, это условие определяется с помощью 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
    

    Есть несколько страшных вещей об этом подходе ... но именно, он не будет делатькопировать по ссылке.Таким образом, если бы в гаджете уже была загружена коллекция объектов, они не были бы доступны через модель без необходимости попадания в БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...