25

Rails 3.2にデータベースクエリをトリガーするコード行を知る方法(gem、プラグインなど)はありますか?たとえば、私のログには次のようなものがあります。

User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 5 LIMIT 1

クエリをトリガーするコード行をどのように知ることができますか?どうも...

4

4 に答える 4

34

私はこの解決策を見つけました:

module QueryTrace
  def self.enable!
    ::ActiveRecord::LogSubscriber.send(:include, self)
  end

  def self.append_features(klass)
    super
    klass.class_eval do
      unless method_defined?(:log_info_without_trace)
        alias_method :log_info_without_trace, :sql
        alias_method :sql, :log_info_with_trace
      end
    end
  end

  def log_info_with_trace(event)
    log_info_without_trace(event)
    trace_log = Rails.backtrace_cleaner.clean(caller).first
    if trace_log && event.payload[:name] != 'SCHEMA'
      logger.debug("   \\_ \e[33mCalled from:\e[0m " + trace_log)
    end
  end
end

一部の初期化子では、QueryTrace.enable!

于 2012-06-06T13:22:58.267 に答える
15

active-record-query-trace宝石の使用:

Gemfile

gem 'active_record_query_trace'

次にbundle、次にconfig/environments/development.rb

ActiveRecordQueryTrace.enabled = true
于 2017-12-30T17:19:29.753 に答える
11

Rails 5.2+

これをあなたの、またはあなたがラインを入れたいどんな環境にも追加してくださいconfig/environments/test.rb。私はレール5でテストしています。

  ActiveRecord::Base.verbose_query_logs = true

ファイルと行を取得します。

于 2019-10-22T16:01:05.730 に答える
-1

BufferedLoggerにモンキーパッチを適用して、必要な処理を実行できます。このファイルをconfig/initializersパスに入れます。

require 'active_support/buffered_logger'

class ActiveSupport::BufferedLogger

  def add(severity, message = nil, progname = nil, &block)
    add_debugging_details(severity)
    @log.add(severity, message, progname, &block)
  end

  private

  EXCLUDE_CALLERS = Gem.paths.path.clone << 'script/rails' << RbConfig::CONFIG['rubylibdir'] << __FILE__

  def add_debugging_details(severity)
    caller_in_app = caller.select do |line|
      EXCLUDE_CALLERS.detect { |gem_path| line.starts_with?(gem_path) }.nil?
    end

    return if caller_in_app.empty?

    @log.add(severity, "Your code in \e[1;33m#{caller_in_app.first}\e[0;0m triggered:")
  end

end if Rails.env.development?
于 2012-06-06T11:32:21.310 に答える