Ответы:
По сути, они делают то же самое, единственная разница в том, на какой стороне отношений вы находитесь. Если a User
имеет a Profile
, то в User
классе, который у вас есть, has_one :profile
и в Profile
классе, который у вас будет belongs_to :user
. Чтобы определить, кто «имеет» другой объект, посмотрите, где находится внешний ключ. Мы можем сказать, что User
«имеет» a, Profile
потому что в profiles
таблице есть user_id
столбец. Однако если бы profile_id
в users
таблице был вызван столбец , мы бы сказали, что a Profile
имеет a User
, и местоположения own_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
Это добавит метод 'author' в модель Book.
Подробнее о режиме см. Руководства
С точки зрения простоты, belongs_to
это лучше, чем has_one
потому has_one
, что в , вы должны добавить следующие ограничения к модели и таблице, имеющей внешний ключ, для обеспечения has_one
взаимосвязи:
validates :foreign_key, presence: true, uniqueness: true