Подтвердить что ты не робот

Какая разница между belongs_to и has_one?

В чем разница между belongs_to и a has_one?

Чтение руководства Ruby on Rails мне не помогло.

4b9b3361

Ответ 1

Они по сути делают то же самое, единственная разница в том, какая сторона отношений вы находитесь. Если 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, будут заменены.

здесь является более подробным объяснением.

Ответ 2

Это о том, где находится внешний ключ.

class Foo < AR:Base
end
  • Если foo belongs_to :bar, то таблица foos имеет столбец bar_id
  • Если foo 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)
)

Ответ 3

has_one и belongs_to обычно одинаковы в том смысле, что они указывают на другую связанную модель. belongs_to убедитесь, что эта модель имеет foreign_key.     has_one гарантирует, что определена другая модель has_foreign.

Более конкретно, существуют две стороны relationship, одна из них - Owner, а другая - Belongings. Если определено только has_one, мы можем получить его Belongings, но не можем получить Owner из Belongings. Чтобы проследить Owner, нам нужно определить belongs_to, а также в принадлежащей ему модели.