Вопрос

Есть ли что-то явно неправильное в использовании ассоциаций 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top