Много-ко-многим ассоциации пользователей и событий - PullRequest
0 голосов
/ 26 апреля 2018

У меня проблемы с тем, чтобы обдумать это.Моя цель - создать простейшие следующие отношения:

  1. Событие принадлежат_ Плакат (Пользователь)
  2. Событие has_many Хосты (Пользователи)
  3. Событие has_many Бронирование (Пользователи)
  4. Событие has_many Upvoters (Пользователи)
  5. Событие has_many Участники (Пользователи)
  6. Событие has_many Гости (пользователи)

Пользователь has_many Сообщений (События) Пользователь has_many Хостинг (События) Пользователь has_many Бронирование (События) Пользователь has_many Upvotes (События) Пользователь has_many Посетил (События)

До сих пор мой подход был с 4 моделями:

class Event < ApplicationRecord
  belongs_to :poster, class_name: "User"
  has_many :hosts, class_name: "User"
  has_many :votes, foreign_key: 'voted_id', dependent: :destroy
  has_many :upvoters, through: :votes, source: :voter

class User < ApplicationRecord
  has_many :posts, class: "Event"

  has_many :votes, foreign_key: 'voter_id', dependent: :destroy
  has_many :upvotes, through: :votes, source: :voted

class Vote < ApplicationRecord
  belongs_to :voter, class_name: "User"
  belongs_to :voted, class_name: "Event"

class Membership < ApplicationRecord
  belongs_to :user
  belongs_to :event

Есть ли способЯ могу использовать класс Membership для каждого из следующих отношений (кроме голосования)?

1 Ответ

0 голосов
/ 26 апреля 2018

Вы можете попробовать что-то вроде этого:

class Membership < ApplicationRecord
  belongs_to :user
  belongs_to :event
  enum type: [ :host, :reservation, :attendance ]
end

class Event < ApplicationRecord
  belongs_to :poster, class_name: "User"

  has_many :host_memberships, -> { host }, class_name: "Membership"
  has_many :reservation_memberships, -> { reservation }, class_name: "Membership"
  has_many :attendance_memberships, -> { attendance }, class_name: "Membership"

  has_many :hosts, through: :host_memberships, source: "User"
  has_many :reservations, through: :reservation_memberships, source: "User"
  has_many :attendees, through: :attendance_memberships, source: "User"
end

class User < ApplicationRecord
  has_many :posts, class_name: "Event"

  has_many :host_memberships, -> { host }, class_name: "Membership"
  has_many :reservation_memberships, -> { reservation }, class_name: "Membership"
  has_many :attendance_memberships, -> { attendance }, class_name: "Membership"

  has_many :hosted, through: :host_memberships, source: "Event"
  has_many :reservations, through: :reservation_memberships, source: "Event"
  has_many :attended, through: :attendance_memberships, source: "Event"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...