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