Tôi có hai kiểu máy.
- Parent
has_manyChildren
;
- Parent
chấp nhận_nested_attributes_forChildren
;Mô hình lồng nhau và xác thực của phụ huynh
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
Tôi sử dụng xác thực để xác thực sự hiện diện của trẻ em cho mọi phụ huynh, vì vậy tôi không thể lưu cha mẹ không có con.
parent = Parent.new :name => "Jose"
parent.save
#=> false
parent.children_attributes = [{:name => "Pedro"}, {:name => "Emmy"}]
parent.save
#=> true
xác thực hoạt động. Sau đó chúng tôi sẽ hủy con qua _destroy
thuộc tính:
parent.children_attributes = {"0" => {:id => 0, :_destroy => true}}
parent.save
#=> true !!!
parent.reload.children
#=> []
vì vậy tôi có thể phá hủy tất cả trẻ em thông qua các hình thức lồng nhau và xác nhận sẽ vượt qua.
Trên thực tế điều đó xảy ra vì sau khi tôi xóa trẻ em từ cha mẹ của tôi qua _delete
, trẻ em phương pháp vẫn trả về phá hủy đối tượng trước khi tôi tải lại nó, vì vậy xác nhận thông qua:
parent.children_attributes = {"0" => {:id => 0, :_destroy => true}}
parent.save
#=> true !!!
parent.children
#=> #<Child id:1 ...> # It's actually deleted
parent.reload.children
#=> []
Có lỗi?
Câu hỏi là gì. Câu hỏi là giải pháp tốt nhất để sửa chữa nó. Cách tiếp cận của tôi là thêm bộ lọc before_destroy vào Child
để kiểm tra xem bộ lọc có phải là bộ lọc cuối cùng hay không. Nhưng nó làm cho hệ thống phức tạp.
tuy nhiên nó sẽ tốt hơn sau đó xác nhận về 'bên Child' :) nhờ – fl00r
và nhờ cho 'marked_for_destruction?' – fl00r
phương pháp xác nhận này vẫn yêu cầu như của Rails 3.0.6 – astjohn