В Rails, в чем разница с использованием "has_many с own_to" против has_many с has_one "? - PullRequest
5 голосов
/ 15 сентября 2010

Например, в

class Student < ActiveRecord::Base
  has_many :awards
end

class Awards < ActiveRecord::Base
  belongs_to :student
end

вышеупомянутое должно быть правильным использованием, но что, если мы используем

class Student < ActiveRecord::Base
  has_many :awards
end

class Awards < ActiveRecord::Base
  has_one :student
end

также не позволяет использовать student.awards как массив объектов Award, а award.student как объект Student, который является получателем награды, поэтому работает так же, как и метод в верхней части сообщения.

Ответы [ 2 ]

7 голосов
/ 15 сентября 2010

has_one используется в случае отношения один-к-одному, а не в отношениях один-ко-многим.

Правильное использование has_one:

class Student < ActiveRecord::Base
  has_one :id_card
end

class IdCard < ActiveRecord::Base
  belongs_to :student
end
1 голос
/ 10 февраля 2015

Два примера не эквивалентны.

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 - это только , используемое там, где существует отношение «один к одному», а в таблице, к которой оно применяется, не имеет внешний ключ.

...