Подтвердить что ты не робот

Has_and_belongs_to_many vs has_many через

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

4b9b3361

Ответ 1

Насколько я помню, 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 

И так далее.

Ответ 2

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

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

Ответ 3

Мое эмпирическое правило: могу ли я получить список флажков здесь? Если это так, то это ассоциация habtm. Если мне нужен флажок, чтобы больше узнать о связи, чем просто да/нет, он должен использовать has_many: through. HABTM так же просто, как использовать метод _ids с помощью simple_form collection_check_boxes. Has_many: через часто включает accepts_nested_attributes_for.

Ответ 4

Вы должны использовать has_many: через, если вам нужны проверки, обратные вызовы или дополнительные атрибуты в модели объединения.

Ответ 5

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

Однако остерегайтесь такого подхода. На ранних этапах разработки приложений практически невозможно узнать, какие дополнительные функции или проверки вам могут понадобиться в далеком будущем жизненного цикла вашего проекта. Если вы решили использовать has_and_belongs_to_many и хотите добавить одно простое назначение данных или проверку через 2 года, перенос этого изменения будет чрезвычайно трудным и подверженным ошибкам. Чтобы быть в безопасности, по умолчанию has_many :through

Ответ 6

Исходя из моего опыта, всегда лучше использовать has_many: through, потому что по крайней мере вы можете добавлять метки времени в таблицу. Много раз во время отладки некоторых ActiveRecord объектов, которые связаны через HABTM, я пропускал created_at, updated_at метки времени. Так что имейте в виду, что это может помочь вам отладить, исследовать проблемы с отношениями данных в контексте времени, потому что без этого вы "слепы", когда отношения были созданы или обновлены.