Như một ví dụ cho vấn đề dependent: :destroy
tròn:Có phụ thuộc vòng tròn Rails 4:: phá hủy cách giải quyết không?
class User < ActiveRecord::Base
has_one: :staff, dependent: :destroy
end
class Staff < ActiveRecord::Base
belongs_to :user, dependent: :destroy
end
Nếu tôi gọi user.destroy
, các liên staff
nên bị hủy diệt là tốt. Ngược lại, gọi số staff.destroy
cũng nên hủy liên kết user
.
Điều này làm việc tuyệt vời trong Rails 3.x, nhưng hành vi đã thay đổi trong Rails 4.0 (và tiếp tục trong 4.1) sao cho một biểu mẫu vòng lặp và cuối cùng bạn gặp lỗi, "cấp độ quá sâu." Một giải pháp rõ ràng là tạo một cuộc gọi lại tùy chỉnh bằng cách sử dụng before_destroy
hoặc after_destroy
để hủy các đối tượng được liên kết theo cách thủ công thay vì sử dụng cơ chế dependent: :destroy
. Ngay cả tình huống issue in GitHub opened for this cũng có một vài người đề xuất cách giải quyết này.
Thật không may, tôi thậm chí không thể có được giải pháp đó để hoạt động. Đây là những gì tôi có:
class User < ActiveRecord::Base
has_one: :staff
after_destroy :destroy_staff
def destroy_staff
staff.destroy if staff and !staff.destroyed?
end
end
Lý do này không làm việc là staff.destroyed?
luôn trả false
. Vì vậy, nó tạo thành một chu kỳ.
bạn đã triển khai logic đó cho cả hai kiểu như Jken13579 đề xuất? – xlembouras
@xlembouras, chưa thử, nhưng tôi chắc chắn nó sẽ không hoạt động. Tôi sẽ thử nó trong tuần này chỉ để chắc chắn. Tôi đã viết dưới đây lý do tại sao nó sẽ không hoạt động. –
@at. bất kỳ may mắn với câu trả lời của tôi? –