Подтвердить что ты не робот

Has_and_belongs_to_many в Rails

Есть ли что-то явно неправильное в использовании has_and_belongs_to_many ассоциаций в rails вместо has_many: через? Я знаю эти статьи описывают различия и работают вокруг, но они с 2006 года. Из того, что я прочитал на SO, кажется, что люди думают, что habtm старый и неуклюжий, но что, если простое, чтобы многие присоединились без какой-либо необходимой модели, - это то, что вы ищете?

Мысли?

4b9b3361

Ответ 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.