имеет и принадлежит ко многим против много через
Пожалуйста, объясните разницу между has_and_belongs_to_many и has_many через отношения. Когда и где использовать, какой?
5 ответов:
насколько я помню,
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
и так далее.
самое простое эмпирическое правило заключается в том, что вы должны настроить has_many :through relationship, если вам нужно работать с моделью отношений как с независимой сущностью. Если вам не нужно ничего делать с моделью отношений, может быть проще настроить отношение has_and_belongs_to_many (хотя вам нужно будет помнить создайте соединительную таблицу в базе данных). Вы должны использовать has_many: through, если вам нужны проверки, обратные вызовы или дополнительные атрибуты в модели соединения.
мое эмпирическое правило, могу ли я пройти со списком флажков здесь? Если это так, то это ассоциация habtm. Если мне нужен флажок, чтобы захватить больше об отношениях, чем просто да/нет он принадлежит, а затем использовать типа has_many :через. HABTM так же просто, как с помощью метода _ids с simple_form collection_check_boxes. Has_many: through часто включает accepts_nested_attributes_for.
вы должны использовать has_many: through, если вам нужны проверки, обратные вызовы или дополнительные атрибуты в модели соединения.
многие ответы уточняют, что вы должны использовать
has_and_belongs_to_many
иhas_many through:
Если вам не нужны никакие дополнительные данные или проверки в таблице соединения., остерегайтесь этого подхода. На ранних стадиях разработки приложений, это почти невозможно чтобы узнать, какие дополнительные функции или проверки вам могут понадобиться в далеком будущем жизненного цикла вашего проекта. Если вы решили использовать
has_and_belongs_to_many
и хочу добавить одну простую точку данных или проверки Через 2 года миграция этого изменения будет чрезвычайно сложной и подверженной ошибкам. Чтобы быть в безопасности, по умолчаниюhas_many :through