gpt4 book ai didi

ruby-on-rails - 如何在发生之前记录 Rails 查询?

转载 作者:行者123 更新时间:2023-12-04 05:59:21 25 4
gpt4 key购买 nike

默认情况下,Rails 记录器将在执行后显示 SQL。有时 - 主要是当查询需要很长时间时 - 我想将记录器配置为在执行之前输出 SQL。然后,一旦数据库响应,它就可以添加后续日志。

基本思想是这样的:

10:01:01 POST Load Executing "SELECT * from posts;'
10:01:03 POST Load 1712ms

如何将 Rails 配置为将 SQL 日志记录分成这样的 2 个步骤?

最佳答案

没有标准方法可以配置记录器以在执行前输出 SQL 查询。

但是您仍然可以通过扩展 ActiveRecord::LogSubscriber 以这种方式记录查询类(class)。

# initializers/extensions/active_record_logger.rb
module Extensions
module ActiveRecordLogger
IGNORE_PAYLOAD_NAMES = ActiveRecord::LogSubscriber::IGNORE_PAYLOAD_NAMES

# ActiveRecord::LogSubscriber doesn't implement this method.
# This method will be invoked before event starts processing.
# It's exactly we are looking for!
def start(name, id, payload)
super

return unless logger.debug?
return if IGNORE_PAYLOAD_NAMES.include?(payload[:name])

name = payload[:name]
sql = payload[:sql]

name = color(name, nil, true)
sql = color(sql, nil, true)

debug "STARTING #{name} #{sql}"
end
end
end

ActiveRecord::LogSubscriber.include Extensions::ActiveRecordLogger

现在您将在执行前获得查询日志。例如,查询
User.find 1

会产生
STARTING  User Load  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]]
#<User id: 1, username: "dimakura", created_at: "2015-09-08 13:16:42", updated_at: "2015-09-08 13:16:42">

关于ruby-on-rails - 如何在发生之前记录 Rails 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32455661/

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