繁体   English   中英

Ruby on Rails扩展了gem的类并更改了它的继承类

[英]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不允许重新定义类的祖先,因此您可以( 但请不要这样做 ):

  1. 抓取原始的/gems/impressionist-1.6.1/lib/impressionist/models/active_record/impression.rb文件的内容。
  2. 将其复制粘贴到您的/blah/foo/impression
  3. 使您的班级显式加载impressionist/models/active_record/impression
  4. 在文件的第二行,未设置原始类

像这样:

require 'impressionist/models/active_record/impression'

Object.send :remove_const, 'Impression'

class Impression < LogsBase
  # ORIGINAL CONTENT OF THIS FILE
end

没有(明智的)方法来重新定义Ruby中的基类。 这是可能的 ,但只能通过怪异的技巧进行。

我建议在这里采取两条路线之一:

  1. 分叉库,并使基类可配置(具有向后兼容性)。
  2. 不要通过继承做到这一点。 而是将establish_connection ENV['SPLACER_LOGS_DB']放入模块中 ,并将其include在类中。

我现在倾向于使用选项2,因为这是一种快速/简单的解决方法,应该与应用程序的其余部分完全吻合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM