Tengo dos modelos.
- Parent
has_many Children
;
- Parent
accepts_nested_attributes_for Children
;
class Parent < ActiveRecord::Base
has_many :children, :dependent => :destroy
accepts_nested_attributes_for :children, :allow_destroy => true
validates :children, :presence => true
end
class Child < ActiveRecord::Base
belongs_to :parent
end
Yo uso la validación para validar la presencia de niños para todos los padres, así que no puedo guardar los padres sin hijos.
parent = Parent.new :name => "Jose"
parent.save
#=> false
parent.children_attributes = [{:name => "Pedro"}, {:name => "Emmy"}]
parent.save
#=> true
la validación de las obras. A continuación, vamos a destruir a los niños a través de la _destroy
atributo:
parent.children_attributes = {"0" => {:id => 0, :_destroy => true}}
parent.save
#=> true !!!
parent.reload.children
#=> []
así que puede destruir a todos los niños a través de los formularios anidados y validación de pasar.
En realidad eso sucede porque después de eliminar hijo de mi padre a través de la _delete
, los niños método devuelve destruido objeto antes de volver a cargarlo, por lo que la validación del pasado:
parent.children_attributes = {"0" => {:id => 0, :_destroy => true}}
parent.save
#=> true !!!
parent.children
#=> #<Child id:1 ...> # It's actually deleted
parent.reload.children
#=> []
Es bug?
¿Cuál es la pregunta. La pregunta es la mejor solución para la reparación. Mi enfoque es agregar before_destroy filtro a Child
, para comprobar si es la última. Pero hace que el sistema complicado.