Remover assosiation em vez de destruir objeto quando: allow_destroy => true
-
18-09-2019 - |
Pergunta
Ao usar o novo accepts_nested_attributes_for
em ActiveRecord, é possível usar o :allow_destroy => true
opção. Quando esta opção for definida, qualquer de hash que contém atributos aninhados como {"_delete"=>"1", "id"=>"..."}
passado para update_attributes
irá excluir o objeto aninhado.
A configuração simples:
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"}})
Pergunta: Como eu - em vez de excluir os objetos aninhados quando "_delete" => "1"
- basta remover a associação? (Isto é, no caso acima definido o forum_id em que o utilizador nil)
Bonus pergunta: E se eu também quero mudar a um atributo no objeto aninhado ao remover a associação? (Por exemplo, como o ajuste de um estado ou de um timestamp)
Solução
Em vez de pedir para o usuário a ser excluído usando "_delete" => '1'
, você pode não apenas atualizá-lo usando as nested_attributes:?
Forum.first.update_attributes("users_attributes"=> {
"0" => {
"id" => "42",
"forum_id" => "",
"state" => 'removed'
}
})