Многие ко многим с пользователями, группами и элементами - PullRequest
0 голосов
/ 12 ноября 2019

У меня проблемы с попыткой понять / обернуть мой мозг вокруг этого. Я пытаюсь создать отношения, которые позволяют это:

  • Пользователь has_many Группы
  • Элемент has_many Группы
  • Группы has_many Пользователь
  • Группы has_manyПредметы

Так что я думаю, что мне нужен Join-Table здесь, но он принадлежит этой таблице к трем моделям или мне нужны две Join-Tables?

class Group < ActiveRecord::Base
  has_many :users
  has_many :items
end

class User < ActiveRecord::Base
  has_and_belongs_to_many :groups
end

class Item < ActiveRecord::Base
  has_and_belongs_to_many :groups
end

Итак, какова правильная миграция для моей Group модели?

1 Ответ

2 голосов
/ 12 ноября 2019

Это две отдельные ассоциации «многие ко многим». Каждая ассоциация «многие ко многим ко многим» требует таблицы соединения.

Для 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...