В чем разница между belongs_to
и a has_one
?
Чтение руководства Ruby on Rails мне не помогло.
В чем разница между belongs_to
и a has_one
?
Чтение руководства Ruby on Rails мне не помогло.
Они по сути делают то же самое, единственная разница в том, какая сторона отношений вы находитесь. Если a User
имеет Profile
, то в классе User
у вас будет has_one :profile
и в классе Profile
у вас будет belongs_to :user
. Чтобы определить, кто "имеет" другой объект, посмотрите, где находится внешний ключ. Можно сказать, что a User
"имеет" a Profile
, потому что таблица profiles
имеет столбец user_id
. Однако, если в таблице users
был столбец с именем profile_id
, мы бы сказали, что a Profile
имеет User
, а места, принадлежащие sort_to/has_one, будут заменены.
здесь является более подробным объяснением.
Это о том, где находится внешний ключ.
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)
)
has_one
и belongs_to
обычно одинаковы в том смысле, что они указывают на другую связанную модель. belongs_to
убедитесь, что эта модель имеет foreign_key
. has_one
гарантирует, что определена другая модель has_foreign
.
Более конкретно, существуют две стороны relationship
, одна из них - Owner
, а другая - Belongings
. Если определено только has_one
, мы можем получить его Belongings
, но не можем получить Owner
из Belongings
. Чтобы проследить Owner
, нам нужно определить belongs_to
, а также в принадлежащей ему модели.