Я обновляю с 3,2 до 4,0. Я заметил, что при использовании ActiveRecord произошли большие изменения в поведении существующей дочерней модели с новой родительской моделью.
Обратите внимание на следующее:
class Parent
has_many :kids
accepts_nested_attributes_for :kids
end
class Kid
belongs_to :parent
end
и следующий контекст:
Kid {id: 1, name: 'kid1', parent_id: nil}
Kid {id: 2, name: 'kid2', parent_id: nil}
Если я отправлю эти параметры на контроллер:
"parent"=>{ "title"=>"mom", "kids_attributes"=>{ "1"=>{"id"=>"1", "name"=> "kiddo"}, "2"=>{"id"=>"2"} }
И сделать:
p = Parent.new(params[:parent])
p.save
С Rails 3.2 результат:
Parent {id: 1, title: 'mom'}
Kid {id: 1, name: 'kiddo', parent_id: 1}
Kid {id: 2, name: 'kid2', parent_id: 1}
Но в Rails 4.0 (после преобразования в strong_parameters) вызов Parent.new
вызывает ошибку
Couldn't find Kid with ID=1 for Parent with ID=
читаю эту ветку
Кажется, теперь мне нужно сначала создать Родителя, а затем спасти детей.
Это проблема в тех случаях, когда у меня могут быть существующие и несуществующие дети, поданные одновременно. Я должен был бы вручную проверить, какие дочерние элементы уже существуют (есть и идентификатор), удалить их из параметров, сохранить родительский элемент, а затем обновить их атрибуты?
Это то, что я должен сделать, чтобы обновить Rails, или есть что-то еще, вызывающее такое другое поведение?
На самом деле, когда я делаю
@parent = Parent.new
@parent.kids.build(parent_parameters[:kids_attributes])
ActiveRecord не выполняет поиск, и дети остаются только с установленным идентификатором. В моем контексте я пока не могу сохранить ни одну из записей.