gpt4 book ai didi

ruby-on-rails - 我可以编写一个 activerecord 作用域,在查询时将结果包装在一个 block 中吗?

转载 作者:行者123 更新时间:2023-12-04 11:35:24 25 4
gpt4 key购买 nike

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

on_replica do
@my_things = MyModel.where(my_attr: "my value").to_a
end
这在大多数情况下效果很好,但如果您实际上不在块中执行查询,则它不起作用:
on_replica do
@my_things = MyModel.where(my_attr: "my value")
end

# this will run its query against the primary DB
@my_things.to_a
我真的很希望能够定义一个范围(或类似范围的东西),以便任何发生在方法链中该点之后的查询都会针对副本发生:
@my_things = MyModel.where(my_attr: "my value").eventually_on_replica

# this runs its query against the replica DB:
@my_things.to_a
是否可以定义 eventually_on_replica以这种方式工作的方法,使用现有的 on_replica方法?如果 MyModel.eventually_on_replica.where(my_attr: "my value") 加分也有效。

最佳答案

我的想法是包裹你的on_replicarelation然后我们可以将它附加到查询链的末尾。
我不知道你的 on_replica不管这个提议是否可行,我只是用 ActiveRecord::Base.connected_to 演示

# lib/active_record/base.rb
module ActiveRecord
module Querying
delegate :eventually_on_replica, to: :all
end

class Relation
def eventually_on_replica(database: nil, role: nil, shard: nil, prevent_writes: false)
ActiveRecord::Base.connected_to(
database: database,
role: role,
shard: shard,
prevent_writes: prevent_writes
) do
self.load
end
end
end
end
演示
# config/application.rb
config.active_record.reading_role = :dev
config.active_record.reading_role = :test

# models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true

connects_to database: { dev: :development, test: :test }
end

# database development
result = Requirement.where(id: [1,2,3]).eventually_on_replica(role: :dev)
result.to_a # have data

# database test
result = Requirement.where(id: [1,2,3]).eventually_on_replica(role: :test)
result.to_a # [] no data
所以你可以尝试更换 ActiveRecord::Base.connected_to通过您的 on_relica .
如果是 Model.eventually_on_replica.where ,我需要设置一个标志来标记正在运行的 on replica然后尝试缓存所有查询链以便稍后执行(在 connected_to 块上),结果证明这是一个非常复杂的情况,并且可能会在正常情况下影响其他查询,所以我不会再进一步​​了。

关于ruby-on-rails - 我可以编写一个 activerecord 作用域,在查询时将结果包装在一个 block 中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67585073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com