2009-05-14 36 views
57

Tôi đang cố gắng hiểu mối quan hệ has_one trong RoR.Sự khác biệt giữa has_one và thuộc_to trong Rails?

Hãy nói rằng tôi có hai mô hình - PersonCell:

class Person < ActiveRecord::Base 
    has_one :cell 
end 

class Cell < ActiveRecord::Base 
    belongs_to :person 
end 

Tôi có thể chỉ cần sử dụng has_one :person thay vì belongs_to :person trong Cell mô hình?

Nó không giống nhau?

+1

một [blog ở đây] tốt (http://requiremind.com/differences-between-has-one-and-belongs-to-in-ruby-on-rails/) cho cùng một! –

+0

Mã trên không chính xác, phải là 'has_one: cell' và' belong_to: person' ở đó ** không ** là dấu cách giữa dấu hai chấm và từ sau. – Josh

Trả lời

142

Không, chúng không thể hoán đổi cho nhau và có một số khác biệt thực sự.

belongs_to có nghĩa là khóa ngoại nằm trong bảng cho lớp này. Vì vậy, belongs_to CHỈ có thể đi trong lớp chứa khóa ngoại.

has_one có nghĩa là có khóa ngoại trong bảng khác tham chiếu đến lớp này. Vì vậy, has_one chỉ có thể đi trong một lớp được tham chiếu bởi một cột trong bảng khác.

Vì vậy, đây là sai:

class Person < ActiveRecord::Base 
    has_one :cell # the cell table has a person_id 
end 

class Cell < ActiveRecord::Base 
    has_one :person # the person table has a cell_id 
end 

Vì vậy, là thế này:

class Person < ActiveRecord::Base 
    belongs_to :cell # the person table has a cell_id 
end 

class Cell < ActiveRecord::Base 
    belongs_to :person # the cell table has a person_id 
end 

Đối với một hiệp hội hai chiều, bạn cần một trong mỗi, và họ phải đi trong lớp đúng. Ngay cả đối với một hiệp hội một chiều, nó quan trọng mà bạn sử dụng.

+0

Câu trả lời hay. Thấy câu trả lời của bạn, tôi nhận ra rằng tôi đã đọc được một nửa câu hỏi. Tôi xin lỗi, nhưng vui mừng vì bạn đã nhảy vào. + 10 –

+5

Tôi đã phải tìm kiếm điều này một tỷ lần. Tôi ước họ đã nghĩ qua việc đặt tên tốt hơn một chút, để làm cho nó rõ ràng hơn, cái nào đi đến đâu. –

+18

Tuyệt vời, bây giờ tôi biết hai câu trả lời sai. Sẽ là tốt hơn để hiển thị "đúng" cách để hiển thị nó. Chỉ cần nói. – y0mbo

7

Sử dụng cả hai cho phép bạn nhận thông tin từ cả hai mô hình Người và Ô.

@cell.person.whatever_info and @person.cell.whatever_info. 
10

Nếu bạn thêm "thuộc_to" thì bạn có liên kết hai chiều. Điều đó có nghĩa là bạn có thể có được một người từ tế bào và một tế bào từ người đó.

Không có sự khác biệt thực sự, cả hai cách tiếp cận (có và không có "thuộc_to") sử dụng cùng lược đồ cơ sở dữ liệu (trường person_id trong bảng cơ sở dữ liệu ô).

Để tóm tắt: Không thêm "thuộc_to" trừ khi bạn cần các liên kết hai chiều giữa các mô hình.

+0

Dòng tốt nhất tôi đã đọc hôm nay: "Nếu bạn thêm" thuộc_to "thì bạn có một liên kết hai chiều. Điều đó có nghĩa là bạn có thể lấy một người từ ô và một ô từ người đó." +1 –

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