【发布时间】:2018-08-16 09:53:20
【问题描述】:
我有一个基于 Ruby on Rails 构建的网络应用程序。 在这个应用程序中显然使用不同的宝石。 我已经到了想要扩展某些特定 gem 的类并为其添加方法的地步。
现在我有一个用例,我想扩展 gem 的类,但我不想添加方法,而是想更改它的继承类 让我们以印象派宝石为例:
我在我的应用程序中创建了一个新类 - app/models/impression.rb
class Impression < ActiveRecord::Base
establish_connection(ENV[App_LOGS_DB'])
end
我想更改继承以使用我的自定义类 LogsBase
class Impression < LogsBase
end
LogsBase 类定义如下:
class LogsBase < ActiveRecord::Base
establish_connection ENV['APP_LOGS_DB']
self.abstract_class = true
end
在尝试运行服务器时,会引发以下异常:
/gems/impressionist-1.6.1/lib/impressionist/models/active_record/impression.rb:5:in `<main>': superclass mismatch for class Impression (TypeError)
根据我的理解,这基本上意味着 gem 的印象类定义与我自己对该类的扩展之间存在冲突。
任何人都可以帮助找出一种方法,我可以更改 Impression 类继承类,同时仍然保持类的行为并使我的服务器正常运行吗?
PS:所有这些的目标是将展示数据写入不同的数据库(日志数据库)而不是主应用程序数据库。为此,我需要建立与日志数据库的连接,但如果直接在 Impression 类中执行此操作,它将炸毁我的数据库连接池,如下面的链接所示:
https://www.thegreatcodeadventure.com/managing-multiple-databases-in-a-single-rails-application/
这就是我需要抽象 LogsBase 类的原因。
任何帮助将不胜感激。
【问题讨论】:
-
考虑对 gem 进行 PR,以允许配置基类。 (然后同时使用你的叉子。)
标签: ruby-on-rails ruby rubygems extending-classes impressionist