Retire assosiation en lugar de destruir objeto cuando: allow_destroy => true
-
18-09-2019 - |
Pregunta
Cuando se utiliza el nuevo accepts_nested_attributes_for
en ActiveRecord, es posible utilizar la opción :allow_destroy => true
. Cuando se establece esta opción, cualquier almohadilla que contiene atributos como {"_delete"=>"1", "id"=>"..."}
pasado a update_attributes
se eliminará el objeto anidado anidado.
Configuración sencilla:
class Forum < ActiveRecord::Base
has_many :users
accepts_nested_attributes_for :users, :allow_destroy => true
end
class User < ActiveRecord::Base
belongs_to :forum
end
Forum.first.update_attributes("users_attributes"=>{"0"=>{"_delete"=>"1", "id"=>"42"}})
Pregunta: ¿Cómo - en lugar de eliminar los objetos anidados cuando "_delete" => "1"
- acaba de quitar la asociación? (Es decir, en el caso anterior establecer el forum_id en el usuario para nil)
Bono pregunta: ¿Qué pasa si yo también quiero cambiar el atributo en el objeto anidado al retirar la asociación? (Por ejemplo, como el establecimiento de un estado o una marca de tiempo)
Solución
En lugar de pedir al usuario que desea eliminar usando "_delete" => '1'
, puede que no sólo actualizarla utilizando los nested_attributes:?
Forum.first.update_attributes("users_attributes"=> {
"0" => {
"id" => "42",
"forum_id" => "",
"state" => 'removed'
}
})