Разница между имеет один и принадлежит к рельсам? [дубликат]
этот вопрос уже есть ответ здесь:
Я пытаюсь понять 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 модель?
разве это не одно и то же?
3 ответов:
нет, они не взаимозаменяемы, и есть некоторые реальные различия.
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для двусторонней связи, вам нужен один из каждого, и они должны идти в правильном классе. Даже для односторонней ассоциации важно, какой из них вы используете.
Если вы добавляете "belongs_to", то вы получили двунаправленную ассоциацию. Это означает, что вы можете получить человека из клетки и клетку от человека.
нет никакой реальной разницы, оба подхода (С и без "belongs_to") используют одну и ту же схему базы данных (поле person_id в таблице базы данных ячеек).
подводя итог: не добавляйте "belongs_to", если вам не нужны двунаправленные ассоциации между моделями.
использование обоих позволяет получить информацию как от человека, так и от моделей клеток.
@cell.person.whatever_info and @person.cell.whatever_info.
Comments