Это две отдельные ассоциации «многие ко многим». Каждая ассоциация «многие ко многим ко многим» требует таблицы соединения.
Для has_and_belongs_to_many
вы можете сгенерировать миграции с помощью:
$ rails g migration CreateJoinTableGroupsUsers group user
$ rails g migration CreateJoinTableGroupsItems group item
Однако has_and_belongs_to_many
очень ограничено и has_many through:
обычно лучше.
Одним из примеров ограничений has_and_belongs_to_many
является то, что вы не можете добавлять дополнительные столбцы в таблицу соединений (метаданные) и не можете напрямую запрашивать таблицу соединений. Таким образом, вы заблуждаетесь, если хотите отслеживать такие вещи, как когда пользователь присоединился к группе или кто добавил элемент в группу.
$ rails g model Membership user:belongs_to group:belongs_to
$ rails g model GroupItem group:belongs_to item:belongs_to
class User < ApplicationRecord
has_many :memberships
has_many :groups, through: :memberships
end
class Group < ApplicationRecord
has_many :memberships
has_many :group_items
has_many :users, through: :memberships
has_many :items, through: :group_items
end
class Membership < ApplicationRecord
belongs_to :user
belongs_to :group
end
class Item < ApplicationRecord
has_many :group_items
has_many :groups, though: :group_items
end
class GroupItem < ApplicationRecord
belongs_to :user
belongs_to :item
end