Ruby on rails 我是否可以编写一个activerecord作用域,在查询时将结果包装在块中?

Ruby on rails 我是否可以编写一个activerecord作用域,在查询时将结果包装在块中?,ruby-on-rails,rails-activerecord,database-replication,Ruby On Rails,Rails Activerecord,Database Replication,我们的rails应用程序有一个主数据库和一个副本数据库。我们已经定义了一个方法,它接受一个块,在块内部,将对复制副本进行查询,如下所示: 在复制副本上执行 @my_things=MyModel.where(my_attr:“my value”)。to_a 结束 这在大多数情况下都很有效,但是如果您没有在块中实际执行查询,那么它就不起作用: 在复制副本上执行 @my_things=MyModel.where(my_attr:“我的价值”) 结束 #这将对主数据库运行其查询 @我的东西 我真的希

我们的rails应用程序有一个主数据库和一个副本数据库。我们已经定义了一个方法,它接受一个块,在块内部,将对复制副本进行查询,如下所示:

在复制副本上执行
@my_things=MyModel.where(my_attr:“my value”)。to_a
结束
这在大多数情况下都很有效,但是如果您没有在块中实际执行查询,那么它就不起作用:

在复制副本上执行
@my_things=MyModel.where(my_attr:“我的价值”)
结束
#这将对主数据库运行其查询
@我的东西
我真的希望能够定义一个范围(或类似范围的东西),以便任何超过方法链中该点的查询都会针对复制副本进行:

@my\u things=MyModel.where(my\u attr:“我的价值”)。最终在副本上
#这将对副本数据库运行其查询:
@我的东西

是否可以使用现有的
on_replica
方法定义一个最终将以这种方式工作的
on_replica
方法?如果
MyModel.finally\u on\u replica.where(my\u attr:“my value”)
也能工作,那么就可以获得额外的积分。

我的想法是将
on\u replica
包装成一个
关系,然后我们可以将它附加到查询链的末尾

我不知道您的
on_replica
是否会对该提案起作用,我只是演示一下

#lib/active_record/base.rb
模块活动记录
模块查询
委托:最终在副本上提交给::all
结束
阶级关系
在复制副本上定义(数据库:nil,角色:nil,碎片:nil,防止写入:false)
ActiveRecord::Base.connected\u到(
数据库:数据库,
角色:角色,,
碎片:碎片,
防止写入:防止写入
)做
自负载
结束
结束
结束
结束
演示

#config/application.rb
config.active\u record.reading\u角色=:dev
config.active\u record.reading\u角色=:test
#模型/应用程序\u record.rb
类ApplicationRecord
因此,您可以尝试用relica上的
替换
ActiveRecord::Base。连接到


模型的情况下,最终在复制副本上运行。其中
,我需要设置一个标志来标记在复制副本上运行的
,然后尝试缓存所有查询链以便稍后执行(在连接到
块的
上)这是一个非常复杂的情况,可能会影响正常情况下的其他查询,所以我不想再进一步了。

对于链末尾的
最终\u on \u replica
方法,我有一个简单的方法

在您的
应用程序\u record.rb
文件中(如果您有它,否则您可能需要修补
ActiveRecord::Base

#app/models/application_record.rb
类ApplicationRecord

但是,只要您调用
finally\u on\u replica
,它就会运行DB查询并加载结果。它不支持延迟加载,但毕竟,当您真正需要结果时,您只需要调用
finally\u on\u replica
,因此这可能适用于您的用例。

这应该如何运行?
on\u replica{query=MyModel.where(..)};on_primary{query=query.where(..)};query.to_a
——这是一组相互矛盾的要求:)如果您展示了当前如何定义副本上的
,这可能会有所帮助。好吧,这样的方法基本上是
ActiveRecord::Base的包装。连接到
,但我认为它不符合逻辑/可能按照您描述的方式工作。然而,我也不认为它是必要/可取的!…为什么您希望/需要指定fy连接,在实际建立连接的上下文之外??如果需要在副本数据库上运行查询,那么为什么不能在查询时指定它?@TomLord我们在\u primary
方法上没有
,也没有一个用例。也许我在\u repl上使用了名称
ica
在这里两次。我提到的第一个已经存在;我不需要帮助编写它。我需要帮助的地方是编写第二个类似于作用域的文件。我会更新这个问题。@TomLord你会问“为什么不能在查询时指定它?”-因为规范发生在控制器中,查询发生在视图中。我们不能只调用
到a
,因为如果可能的话,我们想使用
将对此进行分页。