私は2つのモデルを持っています。
- Parent
has_many Children
;
- Parent
accept_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
検証を使用して、すべての親の子の存在を検証するため、子なしで親を保存することはできません。
parent = Parent.new :name => "Jose"
parent.save
#=> false
parent.children_attributes = [{:name => "Pedro"}, {:name => "Emmy"}]
parent.save
#=> true
検証が機能します。_destroy
次に、属性を介して子を破棄します。
parent.children_attributes = {"0" => {:id => 0, :_destroy => true}}
parent.save
#=> true !!!
parent.reload.children
#=> []
そのため、ネストされたフォームを介してすべての子を破棄でき、検証に合格します。
実際には、を介して親から子を削除した後、_delete
リロードする前に children メソッドが破棄されたオブジェクトを返すため、検証に合格したために発生します。
parent.children_attributes = {"0" => {:id => 0, :_destroy => true}}
parent.save
#=> true !!!
parent.children
#=> #<Child id:1 ...> # It's actually deleted
parent.reload.children
#=> []
バグですか?
質問は何ですか。質問はそれを修復するための最良の解決策です。私のアプローチは、 before_destroy フィルターを追加して、最後のフィルターChild
かどうかを確認することです。しかし、それはシステムを複雑にします。