If auto explain is enabled, this method triggers EXPLAIN logging for the queries triggered by the block if it takes more than the threshold as a whole. That is, the threshold is not checked against each individual query, but against the duration of the entire block. This approach is convenient for relations.
The available_queries_for_explain thread variable collects the queries to be explained. If the value is nil, it means queries are not being currently collected. A false value indicates collecting is turned off. Otherwise it is an array of queries.
# File activerecord/lib/active_record/explain.rb, line 24 def logging_query_plan # :nodoc: return yield unless logger threshold = auto_explain_threshold_in_seconds current = Thread.current if threshold && current[:available_queries_for_explain].nil? begin queries = current[:available_queries_for_explain] =  start = Time.now result = yield logger.warn(exec_explain(queries)) if Time.now - start > threshold result ensure current[:available_queries_for_explain] = nil end else yield end end