Разница между имеет один и принадлежит к рельсам? [дубликат]



этот вопрос уже есть ответ здесь:



Я пытаюсь понять 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 модель?



разве это не одно и то же?

495   3  

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

    Ничего не найдено.