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