簡體   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