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)

¿Fue útil?

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'
  }
})
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top