[英]Ruby on Rails extending a gem's class and changing its inheriting class
我有一个基于Ruby on Rails构建的Web应用程序。 在此应用中,显然使用了不同的宝石。 我到了要扩展某些特定gem的类并为其添加方法的地步。
现在,我有一个用例,我想扩展gem的类,但我不想更改方法,而是要更改其继承类,以印象派宝石为例:
IV在我的应用程序中创建了一个新类-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的印象等级定义与我自己对该等级的定义之间存在冲突。
谁能帮忙找到一种方法,在保持类的行为并使服务器正常运行的同时,我可以更改印象类的继承类?
PS:所有这些操作的目标是将展示数据写入另一个数据库(日志数据库),而不是写入主应用程序数据库。 为了做到这一点,我需要建立到日志数据库的连接,但是如果直接在Impression类中做错了,它将如下面的链接所示炸毁我的数据库连接池:
https://www.thegreatcodeadventure.com/managing-multiple-databases-in-a-single-rails-application/
那就是为什么我需要抽象的LogsBase类。
任何帮助将不胜感激。
免责声明: 请勿这样做!
我能想到的唯一方法是讨厌的hack,既不可靠也不可靠,它与外部gem的较新版本不兼容。 由于Ruby不允许重新定义类的祖先,因此您可以( 但请不要这样做 ):
/gems/impressionist-1.6.1/lib/impressionist/models/active_record/impression.rb
文件的内容。 /blah/foo/impression
。 impressionist/models/active_record/impression
。 像这样:
require 'impressionist/models/active_record/impression'
Object.send :remove_const, 'Impression'
class Impression < LogsBase
# ORIGINAL CONTENT OF THIS FILE
end
没有(明智的)方法来重新定义Ruby中的基类。 这是可能的 ,但只能通过怪异的技巧进行。
我建议在这里采取两条路线之一:
establish_connection ENV['SPLACER_LOGS_DB']
放入模块中 ,并将其include
在类中。 我现在倾向于使用选项2,因为这是一种快速/简单的解决方法,应该与应用程序的其余部分完全吻合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.