Подтвердить что ты не робот

Когда ActiveRecord сохраняет ассоциации?

1) Я знаю, что он сохранит ассоциации, если autosave: true согласно http://railsapi.com/doc/rails-v2.3.8/classes/ActiveRecord/AutosaveAssociation.html

2) Я знаю, что он сохранит ассоциации, которые построены как

book = Book.new(name: 'foo')
book.authors.build(name: 'bar') #has_many
book.save

или как

book = Book.new(name: 'foo')
book.build_author(name: 'bar') #has_one
book.save

3) Я думаю, что ассоциации также сохраняются, когда они назначены или добавлены

book = Book.new(name: 'foo')
book.author = Author.new(name: 'bar')
book.save

или

book = Book.new(name: 'foo')
book.authors << Author.new(name: 'bar')
book.save

Но у меня сложная ошибка, которая включает в себя что-то, что не автосохраняется, когда я этого ожидал. Итак, я хочу отлаживать, проверяя book, чтобы проверить, что, по моему мнению, будет сохранено, будет фактически сохранено.

TL; DR; Какое внутреннее состояние проверяется при сохранении ассоциаций? Я предполагаю, что модель имеет внутреннюю переменную экземпляра типа associations_to_save, с которой ассоциации добавляются, когда они создаются. Затем, когда модель сохраняется, она проходит через эти ассоциации и сохраняет их тоже.

4b9b3361

Ответ 1

К сожалению, таких вещей, как association_to_save, не существует. Однако есть некоторые правила, говорящие, что сохраняется, когда. Вы можете найти их здесь: http://guides.rubyonrails.org/association_basics.html. Очки: 4.1.5 (принадлежит_to), 4.2.5 (has_one), 4.3.4 (has_many) и 4.4.4 (habtm).

UPDATE:

В случае ассоциации has_many, ребенок сохраняется при сохранении родителя, если child.new_record? возвращает true (дочерний объект еще не был сохранен в db), или нужно обновить столбец foreign_key. Вот почему:

  • Добавление объекта в ассоциацию с сохраненным родителем делает сохранение нового дочернего элемента.
  • Добавление объекта в ассоциацию в несохраненном родителе не сохраняет (не имеет значения внешнего ключа)
  • Если несохраненный родитель сохраняется и имеет некоторые дочерние объекты в кеше ассоциации, эти объекты сохраняются для обновления foreign_key.