10

Trong đường ray 3, tôi biết rằng tôi có thể bắt buộc xóa các đối tượng phụ thuộc vào các mối quan hệ thuộc về has_many và has_many bằng cách sử dụng tùy chọn: depends =>: delete. Tuy nhiên tôi đã tự hỏi,Giá trị mặc định cho Rails 3 cho: phụ thuộc vào has_many và thuộc_toố

hành vi mặc định nếu tôi không chỉ định là những gì: phụ thuộc => ...

Chúc mừng, Hajo

+1

nếu bạn không xác định này, bạn sẽ kết thúc với trẻ em bị bỏ rơi khóc cho cha mẹ.Đó không phải là một vấn đề lớn nhưng nó giữ db của bạn đầy (vô dụng) dữ liệu – apneadiving

Trả lời

16

Trong khi nó không được nêu ra trong documentation, các hành vi mặc định là không làm gì với các đối tượng liên quan. Nghĩa là, việc xóa hoặc hủy một đối tượng sẽ không xóa hoặc phá hủy các đối tượng mà nó thuộc về hoặc có nhiều đối tượng.

+0

Cảm ơn bạn đã chỉ ra :) Tôi mong đợi đường ray để cố gắng sử dụng các truy vấn DB để tải các đối tượng phụ thuộc, nếu các lĩnh vực ID của họ không đúng cách nullified. Điều này có nghĩa, lãng phí thời gian CPU và DB để tìm kiếm các bản ghi không tồn tại. Vì vậy, tôi tự hỏi tại sao đường ray không làm bất cứ điều gì về nó theo mặc định ... – fxtentacle

6

has_many sử dụng chiến lược: nullify, sẽ đặt nước ngoài thành null. Đối với has_many: thông qua nó sẽ sử dụng delete_all.

Đối với has_many, phá hủy sẽ luôn gọi phương thức hủy của bản ghi đang được xóa để các cuộc gọi lại được chạy. Tuy nhiên, xóa sẽ thực hiện xóa theo chiến lược được chỉ định bởi tùy chọn : phụ thuộc hoặc nếu không: tùy chọn phụ thuộc được cung cấp, sau đó nó sẽ làm theo chiến lược mặc định. Chiến lược mặc định là: nullify (đặt khóa ngoài thành 0), ngoại trừ has_many: thông qua, trong đó chiến lược mặc định là delete_all (xóa bản ghi tham gia, mà không cần chạy các cuộc gọi lại ).

- ActiveRecord::Associations::ClassMethods

Không chắc chính xác những gì belongs_to làm, và đã không thể tìm thấy bất cứ điều gì trong tài liệu. Tôi sẽ cố gắng đào sớm và cập nhật câu trả lời.

+6

Bạn có chắc chắn đây vẫn là trường hợp? Tôi chỉ kinh nghiệm rằng hành vi mặc định là KHÔNG để vô hiệu hóa các khóa ngoại. Tôi đã phải thiết lập 'phụ thuộc:: nullify' một cách rõ ràng để có được nó để vô hiệu hóa. Tôi đang sử dụng ruby ​​2.0.0 và Rails 4.0.0. – Magne

3

Trong Rails 3, giá trị mặc định :dependent:nullify đặt khóa ngoài thành không.

Chiến lược mặc định là :nullify cho thường lệ has_many. Ngoài ra, điều này chỉ hoạt động ở tất cả nếu phản ánh nguồn là belongs_to.

Nguồn: http://guides.rubyonrails.org/3_1_release_notes.html#active-record

này vẫn là trường hợp trong Rails 4.

Tuy nhiên deletedelete_all hoặc sẽ làm việc xóa theo chiến lược định bởi tùy chọn :dependent, hoặc nếu không có :dependent tùy chọn được đưa ra, sau đó nó sẽ thực hiện theo các chiến lược mặc định. Chiến lược mặc định là :nullify (đặt khóa ngoài là nil), ngoại trừ has_many :through, trong đó chiến lược mặc định là delete_all (xóa bản ghi tham gia, mà không cần chạy lại cuộc gọi lại).

Nguồn: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#module-ActiveRecord::Associations::ClassMethods-label-Delete+or+destroy%3F

Xem thêm các tài liệu mã nguồn: https://github.com/rails/rails/blob/b5a8fd7bb4a6fa4b67d4eabae4cea2cb1834d8d9/activerecord/lib/active_record/associations/collection_proxy.rb#L369

+0

Rất tiếc, điều này không chính xác. Các tài liệu được trích dẫn đề cập đến việc gọi xóa/delete_all trên một liên kết has_many (như 'blog.posts.delete_all'). Gọi 'blog.destroy' trên một mô hình - không phải trên một quan hệ - sẽ không làm gì cả với các mô hình liên kết trừ khi quan hệ' has_many' chỉ định một hành vi 'phụ thuộc'. (Mặc định là để lại tham chiếu lơ lửng) – gmcnaughton

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