gpt4 book ai didi

ruby - 扩展 ActiveSupport::Notifications.subscribe, instantiation.active_record 钩子(Hook)

转载 作者:数据小太阳 更新时间:2023-10-29 07:07:42 24 4
gpt4 key购买 nike

我正在探索 ActiveSupport::Notifications,并且想要更多关于 'instantiation.active_record' 的信息,而不仅仅是 :record_count:类名 [1] .例如,

ActiveSupport::Notifications.subscribe /instantiation.active_record/ do |*args|

args.status #Database or ActiveRecord return status
args.result #The actual result set returned
args.etc .. #Any other info I can collect on the event

# Additional code ...
end

这可以做到吗?如果可以,怎么做?

更新:感谢下面的汤姆和帕维尔。部分挑战在于,我正在构建一个第三方 gem,它将分析主机应用程序的所有 SQL 返回,而无需修改其代码。基本上,将它插入 Gemfile,打包,然后就可以走了。

我正在考虑extending ActiveRecord::Base , 和 using the method append_info_to_payload , 但到目前为止都没有在 gem 中工作。

例如,我想覆盖 ActiveRecord::Querying find_by_sql() 方法的有效负载,如下所示:

payload = {
record_count: result_set.length,
class_name: name,
result_set: result_set
}

在测试和手动编辑我的本地 ActiveRecord gem 时,这会通过 ActiveSupport::Notifications pub/sub 提供完整的 result_set。

答案:所以,答案是使用class_eval方法,并覆盖ActiveRecord::Querying中的find_by_sql方法:

ActiveRecord::Querying.class_eval do
def find_by_sql(sql, binds = [], preparable: nil, &block)
result_set = connection.select_all(sanitize_sql(sql), "#{name} Load", binds, preparable: preparable)
column_types = result_set.column_types.dup
columns_hash.each_key { |k| column_types.delete k }
message_bus = ActiveSupport::Notifications.instrumenter

payload = {
record_count: result_set.length,
class_name: name,
result_set: result_set
}

message_bus.instrument("instantiation.active_record", payload) do
result_set.map { |record| instantiate(record, column_types, &block) }
end
end
end

我将它添加到我的 gem 的 initializer.rb 文件中。

最后:我在 ActiveRecord 上创建了两个拉取请求,让 result_set 在有效负载中传递,以便在 ActiveSupport::Notifications 中使用:querying.rbjoin_dependency.rb .

最佳答案

Can this be done, and if so, how?

我不这么认为。

看看thisthis - 在这两种情况下,payload 都是一个只有 record_countclass_name 选项的哈希。没有指南中描述的额外选项。

关于ruby - 扩展 ActiveSupport::Notifications.subscribe, instantiation.active_record 钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53602951/

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