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的建立连接
在引擎盖下是如何工作的,因此只调用一次可能不会产生一个连接。而且,你也意识到,如果只有一个连接,它将成为一个阻塞点,对吗?