gpt4 book ai didi

ruby-on-rails - 如何使用 around_action 包装每个 Rails ActiveRecord 查询

转载 作者:太空宇宙 更新时间:2023-11-03 16:43:09 24 4
gpt4 key购买 nike

我想创建一个模块,当包含该模块时,它使每个事件记录查询都作为我将包装的 block 执行。

具体来说,我正在使用 https://github.com/zendesk/active_record_shards分片到多个数据库。在这个场景中,我们有 10 个重复的数据库(相同的模式但不同的客户端实例)和 1 个唯一的数据库。默认情况下,对属于 10 个重复数据库的模型的任何调用都将包装在执行

ActiveRecord::Base.on_shard(database_name) do
yield
end

但是我们有一组模型应该只对这个唯一的数据库执行查询。而不是使用像

这样的东西在这些模型上执行每个 ActiveRecord 查询
ActiveRecord::Base.on_shard('unique_db') { Model.find(id) }

我宁愿制作一个模块,当包含在 on_shard 方法中作为一个 block 执行事件记录查询时,它们总是再次执行 unique_db

让我知道我是否走错了路,应该坚持使用基本上只是缩短长度的辅助方法

module UniqeDB
def self.exec!
ActiveRecord::Base.on_shard('unique_db') do
yield
end
end
end

谢谢!

更新:我能够做这样的事情,但是它用 (*args, &block) 覆盖了每个方法,但是有些方法(比如 default_scope)只需要一个 block ,然后它会抛出异常

included do
ActiveRecord::Base.methods.each do |name|
define_singleton_method name do |*args, &block|
ActiveRecord::Base.on_shard('unique_db') do
super(*args, &block)
end
end
end
end

更新:我打开了一个关于 gem 的问题,看看是否有我遗漏的东西 https://github.com/zendesk/active_record_shards/issues/87

最佳答案

Include the below module in any controller like 'include ExecuteInUniqueDB'

All action inside the controller will only in unique_db

module ExecuteInUniqueDB
def self.included(base)
base.class_eval do
around_action :run_on_unique_db
end
end

def run_on_unique_db(&block)
ActiveRecord::Base.on_shard('unique_db', &block)
end
end

关于ruby-on-rails - 如何使用 around_action 包装每个 Rails ActiveRecord 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40314874/

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