Объединение has_many: сквозное с полиморфными ассоциациями - PullRequest
0 голосов
/ 19 сентября 2018

В приложении Rails (5.2) у меня есть User, Organization, Subscription и Event.

User s принадлежат Organization, и оба Users и Organization могут подписаться на Event.

enter image description here

Теперь мне нужно для User получить связанные события как через свой личныйподписка и подписки, принадлежащие его организации.

Я пытаюсь создать subscribable полиморфную ассоциацию.

Таблица subscriptions имеет следующие поля:

  • id
  • event_id
  • subscribable_id
  • subscribable_type

Но теперь я застрял, не уверен, как установить ассоциации между User, Organization и Subscription.

class User < ApplicationRecord
end

class Organization < ApplicationRecord
end

class Subscription < ApplicationRecord
  belongs_to :subscribable, polymorphic: true
  belongs_to :subscriber,   polymorphic: true
end

Ths User должны быть одновременно subscribable и subscriber, но я не могу заставить его работать.

Как установить ассоциации в модели User?

1 Ответ

0 голосов
/ 19 сентября 2018

Код ниже должен сделать

class Subscription < ApplicationRecord
  belongs_to :subscribable, polymorphic: true
  belongs_to :event
end

class User < ApplicationRecord
  has_many :subscriptions, as: :subscribable
  has_many :events, through: :subscriptions
  belongs_to :organization
end

class Organization < ApplicationRecord
  has_many :subscriptions, as: :subscribable
  has_many :events, through: :subscriptions
  has_many :users
end

Теперь, если вы хотите позвонить подписки и события пользователя , тогда

@user.events
@user.subscriptions

Если вы хотите позвонить подписок и событий организации пользователя , затем

@user.organization.events
@user.organization.subscriptions

Пользователь должен быть одновременно подписан и подписчиком, ноЯ не могу заставить его работать.

Не знаю, что вы имели в виду, но если хотите получить подписчиков, добавьте ассоциацию в модель Subscription, например,

class Subscription < ApplicationRecord
  belongs_to :subscribable, polymorphic: true
  belongs_to :event
  has_many :subscribers, source: :user
end

Теперь @subscription.subscribers выдаст список пользователей, подписавшихся на эту подписку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...