Sự khác biệt giữa a belongs_to
và a là has_one
gì?
Đọc hướng dẫn về Ruby on Rails đã không giúp tôi.
Sự khác biệt giữa a belongs_to
và a là has_one
gì?
Đọc hướng dẫn về Ruby on Rails đã không giúp tôi.
Câu trả lời:
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 User
có a Profile
, thì trong User
lớp bạn có has_one :profile
và trong Profile
lớ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 Profile
vì profiles
bảng có một user_id
cột. Tuy nhiên, nếu có một cột được gọi profile_id
trên users
bảng, chúng tôi sẽ nói rằng a Profile
có a User
và 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
Product belongs_to Shop
có nghĩa là products
bảng có shop_id
cột
Đó là về nơi khóa ngoại nằm.
class Foo < AR:Base
end
belongs_to :bar
, thì bảng foos có một bar_id
cộthas_one :bar
, thì bảng thanh có một foo_id
cộtỞ cấp độ khái niệm, nếu bạn class A
có has_one
mối quan hệ với class B
thì đó class A
là cha mẹ của class B
do đó bạn class B
sẽ có belongs_to
mối quan hệ 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 chủ yếu là nơi đặt khóa ngoại, trên bàn cho lớp khai báo belongs_to
mố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)
)
Account
và User
trong 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.
has_one
và belongs_to
nói chung là giống nhau theo nghĩa là chúng trỏ đến mô hình liên quan khác. belongs_to
hã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_foreign
khóa mô hình khác được xác định.
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 ta có thể lấy nó Belongings
nhưng không thể lấy Owner
từ belongings
. Để theo dõi Owner
chúng ta cần xác định belongs_to
cũng như trong mô hình thuộc.
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