Пожалуйста, объясните разницу между has_and_belongs_to_many и has_many через отношения. Когда и где использовать какой?
Has_and_belongs_to_many vs has_many через
Ответ 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
Самое простое правило состоит в том, что вы должны настроить 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
метки времени. Так что имейте в виду, что это может помочь вам отладить, исследовать проблемы с отношениями данных в контексте времени, потому что без этого вы "слепы", когда отношения были созданы или обновлены.