Tengo dos modelos.
- Parent
has_manyChildren
;
- Parent
accept_nested_attributes_forChildren
;Modelos anidados y validación principal
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
utilizo validación para validar la presencia de los niños para todos los padres, por lo que no se puede salvar padres sin hijos.
parent = Parent.new :name => "Jose"
parent.save
#=> false
parent.children_attributes = [{:name => "Pedro"}, {:name => "Emmy"}]
parent.save
#=> true
trabajos de validación. A continuación, vamos a destruir los niños a través de _destroy
atributo:
parent.children_attributes = {"0" => {:id => 0, :_destroy => true}}
parent.save
#=> true !!!
parent.reload.children
#=> []
por lo que puede destruir todos los niños a través de formularios anidados y validación pasará.
En realidad esto sucede porque después borro niño de mis padres a través de _delete
, el método de los niños sigue devolviendo destruido objeto antes de volver a cargarla, por lo que pasó la validación:
parent.children_attributes = {"0" => {:id => 0, :_destroy => true}}
parent.save
#=> true !!!
parent.children
#=> #<Child id:1 ...> # It's actually deleted
parent.reload.children
#=> []
Es error?
¿Cuál es la pregunta. La pregunta es la mejor solución para repararlo. Mi enfoque es agregar el filtro before_destroy al Child
para verificar si es el último. Pero hace que el sistema sea complicado.
sin embargo, es mejor que la validación de ':) gracias secundarios Child' – fl00r
y gracias por' marked_for_destruction? ' – fl00r
Este método de validación todavía se requiere como de rieles 3.0.6 – astjohn