2010-09-28 66 views
103

Sự khác nhau giữa số belongs_to và số has_one là gì?Sự khác nhau giữa thuộc_to và has_one là gì?

Đọc hướng dẫn Ruby on Rails đã không giúp tôi.

+3

có thể trùng lặp của [Sự khác biệt giữa có \ _one và thuộc \ _to trong Rails?] (Http://stackoverflow.com/questions/861144/difference-between-has-one-and-belongs -to-in-rails) – Nakilon

Trả lời

161

Về cơ bản, chúng thực hiện tương tự, sự khác biệt duy nhất là khía cạnh của mối quan hệ bạn đang ở. Nếu số điện thoại User có số Profile, thì trong lớp User bạn có has_one :profile và trong lớp Profile bạn sẽ có belongs_to :user. Để xác định ai "có" đối tượng kia, hãy nhìn vào vị trí khóa ngoại. Chúng tôi có thể nói rằng một số User "có" là Profile vì bảng profiles có cột user_id. Nếu có một cột được gọi là profile_id trên bảng users, tuy nhiên, chúng tôi sẽ nói rằng Profile có một số User và các vị trí thuộc_to/has_one sẽ được đổi chỗ.

here là giải thích chi tiết hơn.

+0

ok có nghĩa là has_a là thuộc tính, trong khi thuộc tính có nhiều quan hệ hơn. – Blankman

+8

blog hay [về điều này] (http://requiremind.com/differences-between-has-one-and-belongs-to-in-ruby-on-rails/). –

+20

Vì vậy, để nói nó thực sự ngắn: 'Sản phẩm thuộc về Cửa hàng' nghĩa là bảng 'sản phẩm' có cột' shop_id' –

31

Đó là về vị trí khóa ngoại.

class Foo < AR:Base 
end 
  • Nếu foo belongs_to :bar, sau đó bảng foos có một cột bar_id
  • Nếu foo has_one :bar, sau đó bảng thanh có một cột foo_id

Trên cấp độ khái niệm, nếu class A của bạn có mối quan hệ has_one với class B thì class A là phụ huynh của class B do đó, class B của bạn sẽ có mối quan hệ belongs_to với class A vì đó là con của class A.

Cả hai thể hiện mối quan hệ 1-1. Sự khác biệt là chủ yếu là nơi để đặt khóa ngoại, mà đi trên bảng cho lớp tuyên bố mối quan hệ belongs_to.

class User < ActiveRecord::Base 
    # I reference an account. 
    belongs_to :account 
end 

class Account < ActiveRecord::Base 
    # One user references me. 
    has_one :user 
end 

Các bảng cho các lớp này có thể giống như thế:

CREATE TABLE users (
    id int(11) NOT NULL auto_increment, 
    account_id int(11) default NULL, 
    name varchar default NULL, 
    PRIMARY KEY (id) 
) 

CREATE TABLE accounts (
    id int(11) NOT NULL auto_increment, 
    name varchar default NULL, 
    PRIMARY KEY (id) 
) 
+0

Đó là câu trả lời giống hệt như câu trả lời được chấp nhận từ hai năm trước. –

+7

Đây là câu trả lời hay hơn. – typeoneerror

3

has_onebelongs_to nói chung là như nhau trong một cảm giác rằng họ trỏ đến mô hình khác có liên quan. belongs_to đảm bảo rằng mô hình này đã xác định foreign_key. has_one đảm bảo rằng mô hình khác được định nghĩa has_foreign.

Cụ thể hơn, có hai mặt của relationship, một là Owner và một là Belongings. Nếu chỉ has_one được xác định, chúng tôi có thể nhận được Belongings nhưng không thể nhận được Owner từ belongings. Để theo dõi các Owner chúng ta cần phải xác định belongs_to cũng như trong mô hình thuộc.

0

Một điều khác mà tôi muốn thêm là, Giả sử chúng ta có sau hiệp hội mô hình

class Author < ApplicationRecord has_many :books end

nếu chúng ta chỉ viết sự liên kết ở trên thì chúng ta có thể nhận được tất cả các sách của một tác giả cụ thể bằng cách,

@books = @author.books 

Nhưng đối với một cuốn sách cụ thể chúng ta không thể có được tác giả tương ứng bằng cách,

@author = @book.author 

để làm cho công việc công việc mã trên chúng ta cần phải thêm hiệp hội để mô hình Book cũng, như thế này

class Book < ApplicationRecord 
    belongs_to :author 
end 

này sẽ bổ sung thêm phương pháp 'giả' để mô hình Book.
Để biết chi tiết về chế độ, hãy xem guides

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