Я решил эту проблему в коде так:
- Включите 'id' строки в таблицу ассоциации в каждый атрибут, который уже был создан. Это позволяет обновлению работать должным образом.
- Используйте флажок для атрибута skill_id. Таким образом, если флажок не установлен, skill_id не будет отображаться в хэше params. Затем я запускаю этот бит кода
</p>
params[:recruit_profile][:recruit_profiles_skills_attributes].map{ |rps|
if rps[:skill_id].nil? then rps[:_destroy] = 1 end
}
Этот бит кода проверит, установлен ли: skill_id. Если он не установлен, то строку необходимо удалить. Чтобы удалить записи, даже если для параметра: allow_destroy задано значение true, можно добавить значение «: _destroy => 1» key => к хешу. Таким образом, будет присутствовать: id и a: _destroy, поэтому update_attributes удалит его.
Выполнение вышеизложенного позволит создать (:: идентификатор отсутствует, но: skill_id присутствует), обновить (: id присутствует и: skill_id присутствует) и уничтожить (: id присутствует, но: skill_id отсутствует). ИМХО, это не так, как это должно работать, но работа выполняется только с 1 дополнительной строкой кода (разбитой на 3 строки из-за длины).
(ПРИМЕЧАНИЕ: замените skill_id любым другим параметром, также присутствующим в вашей таблице ассоциации. Этот обходной путь необходим, только если вы используете таблицы ассоциации с несколькими атрибутами. В противном случае классический collection_ids = [#, #, #] все еще работает с has_many: через ассоциации.)