2012-03-31 31 views

Trả lời

23

Trong Mongoid (và cũng ActiveRecord Tôi tin), delete chỉ loại bỏ đối tượng khỏi cơ sở dữ liệu. destroy sẽ xóa đối tượng và chạy tất cả các cuộc gọi lại thích hợp mà mô hình đã xác định. Vì vậy, nếu bạn có một cuộc gọi lại before_destroy trên mô hình và bạn delete một phiên bản của mô hình đó, cuộc gọi lại before_destroy sẽ không được gọi.

Vì vậy, dependent: :destroy chạy lần gọi lại của mô hình khi xóa và dependent: :delete thì không.

+0

vì vậy nếu tôi không có bất kỳ cuộc gọi lại nào thì chúng giống nhau? –

+2

Vâng, tôi có lẽ sẽ xem xét sử dụng 'phá hủy'. Nếu bạn đã từng thêm một cuộc gọi lại, bạn cần phải nhớ thay đổi nó từ 'delete' thành' destroy' trừ khi bạn không muốn gọi lại thực sự chạy. –

+3

Không có chúng không giống nhau ngay cả khi bạn không có gọi lại. Bởi vì 'destroy' phụ thuộc vào callbacks, nó phải load tài liệu liên quan để thực thi callbacks, và thực hiện truy vấn DELETE. 'delete' chỉ tạo một truy vấn DELETE. Sau đó, tiêu diệt là "an toàn hơn", nhưng xóa là "nhanh hơn" – tothemario

2
  • destroy chạy gọi lại mô hình và sau đó thực hiện truy vấn XÓA đối với DB.
  • delete chỉ cần thực hiện truy vấn XÓA đối với DB.

Tên được lấy từ ActiveRecord, đó là lý do tại sao chúng không khớp với mongo rất tốt.

Bạn có thể thấy delete làm tối ưu hóa trên destroy. Khi bạn sử dụng destroy, bạn đảm bảo rằng các cuộc gọi lại before_destroy được thực hiện, vì vậy việc dọn dẹp hoàn toàn được thực hiện. Mặt khác, nếu bạn làm một cái gì đó như Model.destroy_all, nó phải tải tất cả các phần tử, và sau đó thực hiện một truy vấn loại bỏ cho mỗi phần tử, cho dù Model.delete_all chỉ tạo một truy vấn.

Các vấn đề liên quan