2015-07-10 14 views
9

tôi có một đối tượng A rằng has_many B 's (hiệp hội đơn giản):Ruby on Rails - Hiệp hội bị xóa trước khi "before_destroy"

has_many :book_accounts, { 
    dependent: :destroy 
} 

tôi đã làm việc trên một callback before_destroy. Tôi muốn kiểm tra và đảm bảo rằng không có C 's (thuộc về B) và D' s (thuộc về C) trước khi phá hủy A. Tôi đã kiểm tra nhật ký và tất cả các thông tin của B đang bị xóa trước khi gọi lại khiến cuộc gọi lại bị lỗi.

Đây có phải là cách Rails được cho là hoạt động không? Có điều gì tôi có thể làm khác ngoài việc xóa dependent: destroy và hủy theo cách thủ công số B trong một cuộc gọi lại after_destroy không? Hay đó là giải pháp go-to?

+0

Xem các cuộc thảo luận ở đây: https://github.com/rails/rails/issues/3458 –

Trả lời

16

Đây là vấn đề rất ngớ ngẩn của đường ray & bực bội quá. Khi bạn xác định mối quan hệ trong Rails, tùy chọn :dependent thực sự tạo ra một cuộc gọi lại. Nếu bạn xác định một cuộc gọi lại before_destroy sau mối quan hệ, thì cuộc gọi lại của bạn sẽ không được gọi cho đến khi các mối quan hệ bị hủy.

Giải pháp là yêu cầu gọi lại số before_destroy của bạn trước khi khai báo liên kết.

Mã của bạn sẽ là một cái gì đó như thế này

Class A < ActiveRecord::Base 
    before_destroy :check 

    has_many :book_accounts, dependent: :destroy 
End 
+0

Tôi thực sự chỉ thấy rằng quá (https://github.com/rails/rails/issues/3458), và đã được trong quá trình trả lời các câu hỏi khi bạn trả lời. Cảm ơn bạn! – Isaac

4

có thêm prepend: true để gọi lại tuyên bố:

before_destroy :do_something_before_children_removed, prepend: true