has_and_belongs_to_many по сравнению с has_many через

Объясните различие между has_and_belongs_to_many и has_many через отношения. Когда и где использовать который?

75
задан John Topley 6 May 2010 в 14:47
поделиться

2 ответа

Насколько я помню, has_and_belongs_to_many дает вам простую таблицу поиска, которая ссылается на две ваши модели.

Например,

Истории могут принадлежать многим категориям. Категории могут иметь много историй.

Categories_Stories Table
story_id | category_id

has_many :through дает вам третью модель, которая может быть использована для хранения различных других частей информации, которые не принадлежат ни одной из исходных моделей.

Например

Человек может подписаться на множество журналов. Журналы могут иметь много подписчиков.

Таким образом, мы можем иметь модель подписки в середине, которая дает нам таблицу, похожую на предыдущий пример, но с дополнительными свойствами.

Subscriptions Table
person_id | magazine_id | subscription_type | subscription_length | subscription_date 

И так далее.

103
ответ дан 24 November 2019 в 11:34
поделиться

Из http://guides.rubyonrails.org/association_basics.html#choosing-between-has-many-through-and-has-and-belongs-to-many

Простейшее практическое правило заключается в том, что вы должны настроить связь has_many: through, если вам нужно работать с моделью отношений как с независимым объектом. Если вам не нужно ничего делать с моделью отношений, может быть проще установить связь has_and_belongs_to_many (хотя вам нужно не забыть создать объединяющуюся таблицу в базе данных). Вы должны использовать has_many: через, если вам нужны проверки, обратные вызовы или дополнительные атрибуты в модели соединения.

37
ответ дан 24 November 2019 в 11:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: