[英]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.