имеет и принадлежит ко многим против много через


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

5 65

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 

и так далее.

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

самое простое эмпирическое правило заключается в том, что вы должны настроить 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