Разница между has_one и belongs_to в Rails?

Я пытаюсь понять отношение has_one в RoR.

Скажем, у меня две модели - Person и Cell:

class Person < ActiveRecord::Base
  has_one :cell
end

class Cell < ActiveRecord::Base
  belongs_to :person
end

Можно ли использовать has_one :person вместо belongs_to :person в Cell модели?

Разве это не то же самое?

Ответ 1

Нет, они не взаимозаменяемы, и есть некоторые реальные различия.

belongs_to означает, что внешний ключ находится в таблице для этого класса. Поэтому belongs_to может ТОЛЬКО идти в классе, который содержит внешний ключ.

has_one означает, что в другой таблице есть внешний ключ, который ссылается на этот класс. Поэтому has_one может ТОЛЬКО идти в классе, на который ссылается столбец в другой таблице.

Итак, это неправильно:

class Person < ActiveRecord::Base
  has_one :cell # the cell table has a person_id
end

class Cell < ActiveRecord::Base
  has_one :person # the person table has a cell_id
end

Вот так:

class Person < ActiveRecord::Base
  belongs_to :cell # the person table has a cell_id
end

class Cell < ActiveRecord::Base
  belongs_to :person # the cell table has a person_id
end

Для двухсторонней связи вам нужен один из них, и они должны идти в нужном классе. Даже для односторонней ассоциации важно, какой из них вы используете.

Ответ 2

Если вы добавите "belongs_to" , вы получите двунаправленную связь. Это означает, что вы можете получить человека из клетки и клетки от человека.

Нет никакой реальной разницы, оба подхода (с и без "belongs_to" ) используют одну и ту же схему базы данных (поле person_id в таблице базы данных ячеек).

Подводя итог: не добавляйте "belongs_to" , если вам не нужны двунаправленные ассоциации между моделями.

Ответ 3

Использование обоих позволяет вам получать информацию от моделей Person и Cell.

@cell.person.whatever_info and @person.cell.whatever_info.