has_and_belongs_to_many предназначен для простых отношений «многие ко многим».
has_many: сквозной, с другой стороны, предназначен для косвенных отношений «один ко многим» или «многие ко многим» со свойствами.
Если вы ищете только простые отношения «многие ко многим», я не вижу причин, чтобы не использовать has_and_belongs_to_many.
Пример отношения «многие ко многим»:
Пользователь принадлежит к нулю или более группам, а группа имеет ноль или более участников (пользователей).
Пример отношения «многие ко многим» со свойствами:
Пользователь принадлежит к нулю или более группам, а группа имеет ноль или более членов с рангами.
Например, Алиса может быть администратором в группе A и модератором в группе B. Это свойство можно сохранить в объединяющей таблице.
Пример косвенного отношения один ко многим:
Категория имеет ноль или более подкатегорий, а каждая подкатегория имеет ноль или более элементов.
Поэтому категория имеет ноль или более элементов в своих подкатегориях.
Рассмотрим следующие категории:
Продукты питания → Фрукты, Овощи
Фрукты → Яблоко, Апельсин и др.
Овощи → Морковь, Сельдерей и др.
поэтому:
Еда → Яблоко, Апельсин, Морковь, Сельдерей и т. Д.