Sự khác biệt giữa poss_to và has_one là gì?


Câu trả lời:


241

Về cơ bản họ làm điều 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 có. Nếu a Usercó a Profile, thì trong Userlớp bạn có has_one :profilevà trong Profilelớp bạn có belongs_to :user. Để xác định ai "có" đối tượng khác, hãy xem vị trí của khóa ngoại. Chúng ta có thể nói rằng User"có" a Profileprofilesbảng có một user_idcột. Tuy nhiên, nếu có một cột được gọi profile_idtrên usersbảng, chúng tôi sẽ nói rằng a Profilecó a Uservà các vị trí thuộc về_to / has_one sẽ được hoán đổi.

đây là một lời giải thích chi tiết hơn


ok có ý nghĩa, has_a là tài sản, trong khi thuộc về nhiều hơn một mối quan hệ.
Blankman

48
Vì vậy, để nói rằng nó thực sự ngắn: Product belongs_to Shopcó nghĩa là productsbảng có shop_idcột
Yo Ludke

@ryeguy, nếu đây là mối quan hệ tự tham gia thì sao?
Arian Faurtosh

49

Đó là về nơi khóa ngoại nằm.

class Foo < AR:Base
end
  • Nếu foo belongs_to :bar, thì bảng foos có một bar_idcột
  • Nếu foo has_one :bar, thì bảng thanh có một foo_idcột

Ở cấp độ khái niệm, nếu bạn class Ahas_onemối quan hệ với class Bthì đó class Alà cha mẹ của class Bdo đó bạn class Bsẽ có belongs_tomối quan hệ class Avì đó là con của class A.

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

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ể trông giống như:

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)
)

Đó là khá nhiều giống như câu trả lời được chấp nhận từ hai năm trước đã nêu.
matthias krull

11
Đây là khá nhiều một câu trả lời tốt hơn.
typeoneerror 10/07/2015

Việc sử dụng AccountUsertrong ví dụ này là không may vì thường thì Tài khoản có thể có nhiều người dùng.
karmakaze

5

has_onebelongs_tonói chung là giống nhau theo nghĩa là chúng trỏ đến mô hình liên quan khác. belongs_tohãy chắc chắn rằng mô hình này có foreign_keyđịnh nghĩa. has_oneđảm bảo rằng has_foreignkhóa mô hình khác được xác định.

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


3

Một điều nữa mà tôi muốn thêm là, Giả sử chúng ta có liên kết mô hình

class Author < ApplicationRecord has_many :books end

nếu chúng ta chỉ viết hiệp hội trên thì chúng ta có thể nhận được tất cả các cuốn 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 tôi không thể có được tác giả tương ứng,

@author = @book.author

để làm cho mã trên hoạt động, chúng ta cũng cần thêm liên kết vào mô hình Sách, như thế này

class Book < ApplicationRecord
  belongs_to :author
end

Điều này sẽ thêm phương thức 'tác giả' vào mô hình Sách.
Để biết chi tiết chế độ, xem hướng dẫn


0

Từ quan điểm đơn giản, belongs_totốt hơn là has_onevì trong has_one, bạn sẽ phải thêm các ràng buộc sau vào mô hình và bảng có khóa ngoại để thực thi has_onemối quan hệ:

  • validates :foreign_key, presence: true, uniqueness: true
  • thêm một chỉ mục duy nhất cơ sở dữ liệu trên khóa ngoại.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.