Has_and_belongs_to_many в Rails
Есть ли что-то явно неправильное в использовании has_and_belongs_to_many ассоциаций в rails вместо has_many: через? Я знаю эти статьи описывают различия и работают вокруг, но они с 2006 года. Из того, что я прочитал на SO, кажется, что люди думают, что habtm старый и неуклюжий, но что, если простое, чтобы многие присоединились без какой-либо необходимой модели, - это то, что вы ищете?
Мысли?
Ответы
Ответ 1
has_and_belongs_to_many предназначен для простых отношений "многие ко многим" .
has_many: через, с другой стороны, предназначен для косвенных отношений "один ко многим" или "многих ко многим" со свойствами.
Если вы ищете только отношения "многие-ко-многим", я не вижу причин не использовать has_and_belongs_to_many.
Пример отношения "многие ко многим" :
Пользователь принадлежит к нулю или более группам, а группа имеет ноль или более членов (пользователей).
Пример отношения "многие ко многим" со свойствами:
Пользователь принадлежит к нулю или более группам, а группа имеет ноль или более членов с рангом.
Например, Алиса может быть администратором группы A и модератором в группе B. Вы можете сохранить это свойство в таблице соединений.
Пример косвенных отношений "один-ко-многим":
Категория имеет ноль или более подкатегорий, и каждая подкатегория имеет ноль или более элементов.
Таким образом, категория имеет ноль или более элементов через свои подкатегории.
Рассмотрим следующие категории:
Продукты питания → Фрукты, Овощи
Фрукты → Apple, Orange и т.д.
Овощи → Морковь, сельдерей и т.д.
поэтому:
Еда → Apple, Orange, морковь, сельдерей и т.д.
Ответ 2
Нет ничего плохого в использовании has_and_belongs_to_many
, если вам не нужна модель соединения. Я только что использовал его в недавнем проекте.
Ответ 3
Я бы никогда не использовал HABTM не из-за какой-либо озабоченности элегантностью, а потому, что я всегда могу предположить, что хочу добавить данные в отношения в будущем, даже если я не могу сейчас увидеть это. Я ленив, я хотел бы просто добавить столбцы в соединение, а не перерабатывать отношения, а затем добавить столбцы.
Ответ 4
Я думаю об этом так. Предполагая, что вы уже нашли, что вам нужна модель "многие-ко-многим":
X----1
__/
/
Y----2
__/
/
Z----3
(x- > 1 y- > 1,2 z- > 2,3)
Используйте связь HABTM, если вам НЕ нужно хранить информацию о каждой из строк на моем (надеюсь, узнаваемом) изображении выше.
Если вам нужно сохранить информацию об этих строках (отношениях), используйте "сквозной".
Итак, если вы просто говорите, что люди [XYZ] имеют и принадлежат к проектам [123], но не нужно ничего говорить о человеке X в проекте 1, используйте HABTM.
Если вы хотите сказать, что у человека X есть проект 1 и ему был присвоен этот проект на заданную дату, у вас внезапно есть должным образом для этой конкретной связи и лучше использовать HMT.