Từ hướng dẫn tốt :
Vì vậy, :delete_all
thực hiện chăm sóc các khóa ngoại nhưng, vì không có lệnh gọi lại nào được gọi, nó chỉ đi sâu một cấp. Vì vậy, điều này trong Company
:
has_many :projects, dependent: :delete_all
nghĩa là gọi #destroy
trên một công ty sẽ trực tiếp xóa các projects
được liên kết từ cơ sở dữ liệu. Nhưng điều đó sẽ không nhìn thấy điều này:
has_many :tasks, dependent: :delete_all
mà bạn có trong Project
và cuối cùng bạn cố gắng xóa các dự án vẫn được tham chiếu trong tasks
như thông báo lỗi chỉ ra.
Bạn có thể chuyển tất cả các liên kết của mình thành dependent: :destroy
, điều này sẽ kéo mọi thứ ra khỏi cơ sở dữ liệu trước khi phá hủy chúng và các lệnh gọi lại sẽ được gọi (sẽ tải nhiều thứ hơn ra khỏi cơ sở dữ liệu chỉ để phá hủy chúng sẽ tải nhiều thứ hơn ra khỏi cơ sở dữ liệu ...). Kết quả cuối cùng sẽ là rất nhiều hoạt động của cơ sở dữ liệu nhưng tất cả các khóa ngoại sẽ được tuân theo đúng cách.
Ngoài ra, bạn có thể đặt logic bên trong cơ sở dữ liệu nơi nó thường thuộc về bằng cách chỉ định on delete cascade
về các ràng buộc khóa ngoài
:
add_foreign_key
của bạn cuộc gọi sẽ giống như sau:
add_foreign_key "projects", "companies", on_delete: :cascade
add_foreign_key "tasks", "projects", on_delete: :cascade
add_foreign_key "task_times", "tasks", on_delete: :cascade
trong trường hợp này. Bạn có thể muốn để dependent: :delete_all
s trong các mô hình của bạn như một lời nhắc nhở về những gì đang xảy ra hoặc bạn có thể để lại cho mình một nhận xét.