Ruby on rails Rails在类之间共享自定义数据库连接-没有类继承?

Ruby on rails Rails在类之间共享自定义数据库连接-没有类继承?,ruby-on-rails,ruby,inheritance,Ruby On Rails,Ruby,Inheritance,我有一个副本数据库从运行,我想发送一些只读调用到,卸载主。出于这个原因,我想创建两个海关模型,分别连接到该数据库,以便在需要卸载某些查询时使用它们 我有两门课: class Car < ActiveRecord::Base has_many :prices end class Price < ActiveRecord::Base belongs_to :car end class-Car

我有一个副本数据库从运行,我想发送一些只读调用到,卸载主。出于这个原因,我想创建两个海关模型,分别连接到该数据库,以便在需要卸载某些查询时使用它们

我有两门课:

class Car < ActiveRecord::Base
  has_many :prices
end

class Price < ActiveRecord::Base
  belongs_to :car
end
class-Car
Rails可以在模型级别共享自定义数据库连接,如下所示:

class MyCustomDbConnection < ActiveRecord::Base
  self.abstract_class = true
  establish_connection({database: 'www.slavedb.com', port: 5432, pass: 'some'})
end

class ReadonlyCar < MyCustomDbConnection
end

class ReadonlyPrice < MyCustomDbConnection
end
类MyCustomDbConnection

虽然这很有效,但我的用例是,我还希望“ReadonlyCar”和
ReadonlyPrice
继承使用默认
ActiveRecord::Base.connection的原始模型。这需要使ReadonlyCar的行为与原始车的行为完全相同(业务逻辑)。现在我不能同时从
ReadonlyCar
ReadonlyCar
进行类继承,那么如何从
Car
获得完整的功能呢,但是在
ReadonlyCar
ReadonlyPrice
之间共享到从机的相同连接。

您可以编写一个模块,在包含的钩子中执行该调用以建立连接

module MyCustomDbConnection
  def self.included(base)
    base.establish_connection(
      database: 'www.slavedb.com',
      port: 5432,
      pass: 'some'
    )
  end
end

class ReadOnlyCar < Car
  include MyCustomDbConnection
end
模块MyCustomDbConnection
def自带(基本)
base.u建立连接(
数据库:“www.slavedb.com”,
港口:5432,
传球:“一些”
)
结束
结束
类ReadOnlyCar
太好了,你知道我如何确认吗,如果我做了
ReadonlyCar.first?
ReadonlyPrice.first
,它实际上使用的是相同的连接,而不仅仅是创建一个新的连接?每次模块被包含到某个地方时,都会执行包含的钩子。在您的情况下,这意味着
build\u connection
被调用一次,其中
base
ReadonlyPrice
,而
base
ReadonlyCar
。您想只进行一次连接吗?如果是这样,您需要使用单例。如果这是你真正想要实现的,我可以用它来扩展我的答案。是的,我的想法是,如果我这样做的话,我不希望它与连接有关,例如,
ReadonlyCar.first.prices.first.car
Alos,我希望能够访问该连接,以原子方式设置
搜索路径
(postgresql功能)。我不明白,你不想让它。。。。?另外,我也不完全确定AR的
建立连接
在引擎盖下是如何工作的,因此只调用一次可能不会产生一个连接。而且,你也意识到,如果只有一个连接,它将成为一个阻塞点,对吗?