2012-05-05 31 views
46

Hãy tưởng tượng tình huống sau đây:thực hành tốt nhất về sản phẩm nào belongs_to hiệp hội

Tôi có một mô hình dog và một mô hình house. Một con chó có thể thuộc về một ngôi nhà, và một ngôi nhà có thể có nhiều con chó, vì vậy:

Class Dog < ActiveRecord::Base 
    belongs_to :house 
end 

Class House < ActiveRecord::Base 
    has_many :dogs 
end 

Bây giờ, hãy tưởng tượng rằng tôi cũng muốn tạo chó mà không có một ngôi nhà. Họ không thuộc về nhà. Tôi vẫn có thể sử dụng cấu trúc mối quan hệ đó và chỉ cần không thông báo cho :house_id khi tạo cấu trúc đó?

Có thực tiễn nào tốt hơn không?

Obs .: Tôi đã sử dụng sự tương tự này để đơn giản hóa vấn đề của mình, nhưng tình hình thực tế của tôi là: Tôi có một mô hình mà người dùng có thể tạo ra các phiên bản của nó. Anh ta cũng có thể tạo ra các bộ sưu tập của những trường hợp đó, nhưng anh ta có thể để lại một cá thể bên ngoài một bộ sưu tập.

+2

yes..you có thể để lại '' house_id' null' và khi bạn '@ dog.house' nó sẽ trở lại 'nil' và do đó bạn có thể kiểm tra xem nó như' nếu @dog. house' và như vậy .. – rubyprince

+2

Để đảm bảo điều này hoạt động, trong cơ sở dữ liệu của bạn, bảng Dog không được có phần rỗng của 't.integer" house_id ",: null => false'. – Ashitaka

Trả lời

22

Tôi nghĩ đó là cách tiếp cận hoàn toàn bình thường.

Bạn chỉ có thể để house_id với giá trị null trong cơ sở dữ liệu cho các kiểu không thuộc về loại khác.

199

Hãy cẩn thận với điều này trong Rails 5 ...

belongs_to được yêu cầu theo mặc định

Từ giờ trở đi mọi ứng dụng Rails sẽ có một cấu hình mới tùy chọn config.active_record.belongs_to_required_by_default = true, nó sẽ kích hoạt lỗi xác thực khi cố gắng lưu mô hình trong đó thuộc về các liên kết không có mặt.

config.active_record.belongs_to_required_by_default có thể được thay đổi để sai và với điều này tiếp tục hành vi Rails cũ hoặc chúng ta có thể vô hiệu hóa xác nhận này trên mỗi nét belongs_to, chỉ cần đi qua một tùy chọn bổ sung tùy chọn: đúng như sau:

class Book < ActiveRecord::Base 
    belongs_to :author, optional: true 
end 

từ: http://blog.michelada.io/whats-new-in-rails-5

+15

đây là câu trả lời cho người dùng Rails 5 –

+2

Đã dành 2 đêm trên trang này ... cảm ơn các bạn. Có thể xác nhận tùy chọn: true thực hiện thủ thuật. trường hợp sử dụng của tôi là: lớp 'tài

+0

này lưu lại cho tôi rất nhiều khuấy, nhờ Ivan for the tip Rails5 . – Laurie

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