Відповіді:
Вони по суті роблять те саме, різниця лише в тому, на якій стороні відносин ви перебуваєте. Якщо у a User
є Profile
, то в User
класі, який ви мали б, has_one :profile
і в Profile
класі, який ви мали б belongs_to :user
. Щоб визначити, хто "має" інший об'єкт, подивіться, де знаходиться зовнішній ключ. Можна сказати, що User
"має" a, Profile
оскільки в profiles
таблиці є user_id
стовпець. Якби profile_id
у users
таблиці був стовпчик, який називається , ми б сказали, що a Profile
має a User
, а місця значень pripada_to / has_one будуть замінені.
ось більш детальне пояснення.
Product belongs_to Shop
засобів products
має shop_id
колонку
Йдеться про те, де сидить іноземний ключ.
class Foo < AR:Base
end
belongs_to :bar
, то в таблиці foos є bar_id
стовпецьhas_one :bar
, то в таблиці брусків є foo_id
стовпецьНа концептуальному рівні, якщо у вас class A
є has_one
стосунки з class B
тодішнім class A
батьком, class B
отже, ви class B
матимете belongs_to
стосунки, class A
оскільки це дитина class A
.
Обидва виражають відношення 1-1. Різниця полягає в тому, де розмістити зовнішній ключ, який йде на стіл для класу, що декларує 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
Таблиці для цих класів можуть виглядати приблизно так:
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
та User
в цьому прикладі прикро, оскільки часто трапляється так, що в обліковому записі може бути багато користувачів.
has_one
і, belongs_to
як правило, однакові в тому сенсі, що вони вказують на іншу споріднену модель. belongs_to
переконайтесь, що ця модель foreign_key
визначена.
has_one
переконує, що інша модельhas_foreign
ключ .
Якщо бути більш конкретним, то є дві сторони relationship
, одна є, Owner
а інша є Belongings
. Якщо тільки has_one
визначено, ми можемо отримати його, Belongings
але не можемо отримати його Owner
від belongings
. Щоб простежити, Owner
нам потрібно визначити belongs_to
також відповідну модель.
Ще одне, що я хочу додати, це, припустимо, у нас є наступні асоціації моделей
class Author < ApplicationRecord
has_many :books
end
якщо ми пишемо тільки вищезгадану асоціацію, то ми можемо отримати всі книги конкретного автора,
@books = @author.books
Але для певної книги ми не можемо знайти відповідного автора,
@author = @book.author
щоб зробити роботу вищезгаданого коду нам потрібно також додати асоціацію до моделі Book, як це
class Book < ApplicationRecord
belongs_to :author
end
Це додасть метод "автор" до моделі Book.
Детальну інформацію про режим див. У посібниках
З точки зору простоти, belongs_to
це краще, ніж has_one
через те has_one
, що вам доведеться додати наступні обмеження до моделі та таблиці, у яких є закордонний ключ для забезпечення has_one
відносин:
validates :foreign_key, presence: true, uniqueness: true