结合has_many:through与多态关联

时间:2018-09-19 10:55:24

标签: ruby-on-rails

在Rails(5.2)应用程序中,我有UserOrganizationSubscriptionEvent

User属于Organization,并且UserOrganization都可以订阅Event

enter image description here

现在我需要User通过他的个人订阅和属于他的组织的订阅来获取相关事件。

我正在尝试创建subscribable多态关联。

subscriptions表具有以下字段:

  • id
  • event_id
  • subscribable_id
  • subscribable_type

但是现在我被困住了,不确定如何设置UserOrganizationSubscription之间的关联。

class User < ApplicationRecord
end

class Organization < ApplicationRecord
end

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

User应该同时位于subscribablesubscriber上,但是我无法使其正常工作。

我应该如何在User模型中设置关联?

1 个答案:

答案 0 :(得分:2)

下面的代码应该做

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

如果您要呼叫用户组织的 subscriptions events ,则

@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将提供订阅该订阅的用户列表。