Два примера не эквивалентны.
has_many
и belongs_to
работают в паре, где существует отношение «многие к одному».
В базе данных это будет выглядеть так:
**Students**
Name
Email
...
**Awards**
Name
student_id <-- !IMPORTANT!
...
Каждый Student
имеет много наград, следовательно has_many :awards
Каждый Award
'принадлежит' a Student
, следовательно belongs_to :student
Обратите внимание, что belongs_to
применяется к таблице с внешним ключом student_id
. Это важно.
ОК - так что же происходит, когда есть отношения «один к одному»?
Если бы у каждого учащегося могла быть только одна награда, таблицы базы данных могли бы выглядеть точно так же, но модель не могла бы возвращать коллекцию предметов.
Здесь нам нужно объявление has_one
. Это будет применяться к модели Student
в этом случае. Зачем? Поскольку отношения в обоих направлениях одинаковы, но Active Record необходимо знать, где найти внешний ключ.
Если бы таблицы базы данных были наоборот, каждый Student
имел award_id
, тогда Student
получил бы belongs_to
, а Award
получил бы has_one
.
Надеюсь, это прояснит?
Кажется немного странным, что студент может «принадлежать» к награде, если вы используете естественный язык. Но именно так пишется специфичный для домена рельс активная запись.
Звучание становится еще более неестественным, когда вы смотрите на отношения «многие ко многим» с «has_many_and_belongs_to». Здесь есть объединяющая таблица, сайт между вашими основными таблицами, например
students_awards
student_id
award_id
В этой ситуации ни таблица Students
, ни таблица Awards
не имеют внешнего ключа, но оба будут содержать объявление has_many_and_belongs_to :other_table
. Обе таблицы могут объединяться в несколько строк другой. Каждый Student
может иметь более одного Award
. Каждый Award
может применяться ко многим Students
.
Объявление has_one
- это только , используемое там, где существует отношение «один к одному», а в таблице, к которой оно применяется, не имеет внешний ключ.