首页 > 解决方案 > 使用评论员 gem 时解决具有现有订阅模型的应用程序

问题描述

我正在使用commontator gem来实现评论功能。但是有一个问题,因为这个 gem 也使用订阅模型,我们的 gem 也使用订阅模型。所以有一个thread_id列与commontator的订阅表相关联。但是当它正在访问我们的订阅模型时......它给出了一个错误PG::UndefinedColumn: ERROR: column subscriptions.thread_id does not exist

对于实际上给出错误并具有关联的线程模型has_many: subscriptions......我添加了class_name,如下所示

module Commontator
class Thread < ActiveRecord::Base
belongs_to :closer, polymorphic: true, optional: true
belongs_to :commontable, polymorphic: true, optional: true
has_many :comments, dependent: :destroy
has_many :subscriptions, class_name: "Commontator::Subscription", dependent: :destroy

但这也仍然返回我的订阅模型:

pry(#<Commontator::Thread>)> subscriber.subscriptions
=> [#<Subscription:0x00007fabcc5d3340
  id: 1,
  kind: "free",
  end_date: nil,
  user_id: 2,
  channel_id: 1,
  created_at: Thu, 04 Apr 2019 11:21:15 UTC +00:00,
  updated_at: Thu, 04 Apr 2019 11:21:15 UTC +00:00>]

我的 user.rb 包括has_many :subscriptions, dependent: :destroy

Commontator 的订阅模型与 my_subscription 模型

irb(main):017:0> Commontator::Subscription.new
=> #<Commontator::Subscription id: nil, subscriber_type: nil, subscriber_id: nil, thread_id: nil, created_at: nil, updated_at: nil>
irb(main):018:0> Subscription.new
=> #<Subscription id: nil, kind: "free", end_date: nil, user_id: nil, channel_id: nil, created_at: nil, updated_at: nil>

有什么方法可以在不更改订阅模型名称的情况下处理这个问题?

标签: ruby-on-rails-4

解决方案


@vaishnavi,commontator rails 引擎要求您添加acts_as_commontator到应该允许评论的模型中。

在大多数明显包含User模型的 Rails 应用程序中

这是修复问题所需更改的PR 。

gem 'commontator', git: "git@github.com:pikender/commontator.git", branch: "fixes/issue-135"如果它为您解决了问题,请尝试Gemfile通过测试和确认来帮助他人。

希望这可以解决您的问题并快乐编码:)


在此处添加更改差异以供将来参考,以防上述 PR 被删除或丢失

所需的更改很容易更改subscriptions关联commontator_subscriptions并更改它的引用,只有两个(感觉很幸运:))

diff --git a/app/models/commontator/thread.rb b/app/models/commontator/thread.rb
index 83e51e3..b410b23 100644
--- a/app/models/commontator/thread.rb
+++ b/app/models/commontator/thread.rb
@@ -91,7 +91,7 @@ module Commontator

     def subscription_for(subscriber)
       return nil if !subscriber || !subscriber.is_commontator
-      subscriber.subscriptions.where(thread_id: self.id).first
+      subscriber.commontator_subscriptions.where(thread_id: self.id).first
     end

     def subscribe(subscriber)
diff --git a/lib/commontator/acts_as_commontator.rb b/lib/commontator/acts_as_commontator.rb
index 1497ebb..2fe11a6 100644
--- a/lib/commontator/acts_as_commontator.rb
+++ b/lib/commontator/acts_as_commontator.rb
@@ -17,12 +17,12 @@ module Commontator

           has_many :comments,      as: :creator,
                                    class_name: 'Commontator::Comment'
-          has_many :subscriptions, as: :subscriber,
+          has_many :commontator_subscriptions, as: :subscriber,
                                    class_name: 'Commontator::Subscription',
                                    dependent: :destroy
         end
       end
diff --git a/spec/lib/commontator/acts_as_commontator_spec.rb b/spec/lib/commontator/acts_as_commontator_spec.rb
index 11a9cda..cade863 100644
--- a/spec/lib/commontator/acts_as_commontator_spec.rb
+++ b/spec/lib/commontator/acts_as_commontator_spec.rb
@@ -17,7 +17,7 @@ module Commontator
     it 'must modify models that act_as_commontator' do
       user = DummyUser.create
       expect(user).to respond_to(:comments)
-      expect(user).to respond_to(:subscriptions)
+      expect(user).to respond_to(:commontator_subscriptions)
       expect(user).to respond_to(:commontator_config)
       expect(user.commontator_config).to be_a(CommontatorConfig)
     end

推荐阅读