Sự khác biệt giữa a belongs_tovà a là has_onegì?
Đọc hướng dẫn về Ruby on Rails đã không giúp tôi.
Sự khác biệt giữa a belongs_tovà a là has_onegì?
Đọ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 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 Profilevì profilesbả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
Product belongs_to Shopcó nghĩa là productsbảng có shop_idcột
                    Đó là về nơi khóa ngoại nằm.
class Foo < AR:Base
endbelongs_to :bar, thì bảng foos có một bar_idcộthas_one :bar, thì bảng thanh có một foo_idcộtỞ cấp độ khái niệm, nếu bạn class Acó has_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
endCá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)
)Accountvà Usertrong 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_onevà belongs_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.
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.booksNhư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