Нет, они не взаимозаменяемы, и есть некоторые реальные различия.
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
Для двунаправленной ассоциации, необходимо один из каждого, и они должны идти в правильном классе. Даже для односторонней ассоциации важно то, что вы используете.
один хороший [блог здесь] (http://requiremind.com/differences-between-has-one-and-belongs-to-in-ruby-on-rails/) для того же! –
Неверный код, должен быть 'has_one: cell' и' belongs_to: person' там должно быть ** не ** быть пробелом между двоеточием и следующим словом. – Josh