aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorRafael França <rafaelmfranca@gmail.com>2016-07-20 12:58:42 -0300
committerGitHub <noreply@github.com>2016-07-20 12:58:42 -0300
commitf88495d519f9bdacd542d61b4e8117eb4f79c173 (patch)
tree9af8ea802786a3e8f92a554bed78b1abbad6fae0 /activerecord/lib
parentb1d48d542452e5d87b42a8af513b7102d92b0684 (diff)
parent7d1dc9841cfce02b32a1a9373e1e8c08cb801269 (diff)
downloadrails-f88495d519f9bdacd542d61b4e8117eb4f79c173.tar.gz
rails-f88495d519f9bdacd542d61b4e8117eb4f79c173.tar.bz2
rails-f88495d519f9bdacd542d61b4e8117eb4f79c173.zip
Merge pull request #25885 from kamipo/fix_explain_logging_with_binds
Fix explain logging with binds
Diffstat (limited to 'activerecord/lib')
-rw-r--r--activerecord/lib/active_record/explain.rb29
1 files changed, 20 insertions, 9 deletions
diff --git a/activerecord/lib/active_record/explain.rb b/activerecord/lib/active_record/explain.rb
index 727a9befc1..ac27e72f2b 100644
--- a/activerecord/lib/active_record/explain.rb
+++ b/activerecord/lib/active_record/explain.rb
@@ -16,15 +16,14 @@ module ActiveRecord
# Makes the adapter execute EXPLAIN for the tuples of queries and bindings.
# Returns a formatted string ready to be logged.
def exec_explain(queries) # :nodoc:
- str = queries.map do |sql, bind|
- [].tap do |msg|
- msg << "EXPLAIN for: #{sql}"
- unless bind.empty?
- bind_msg = bind.map {|col, val| [col.name, val]}.inspect
- msg.last << " #{bind_msg}"
- end
- msg << connection.explain(sql, bind)
- end.join("\n")
+ str = queries.map do |sql, binds|
+ msg = "EXPLAIN for: #{sql}"
+ unless binds.empty?
+ msg << " "
+ msg << binds.map { |attr| render_bind(attr) }.inspect
+ end
+ msg << "\n"
+ msg << connection.explain(sql, binds)
end.join("\n")
# Overriding inspect to be more human readable, especially in the console.
@@ -34,5 +33,17 @@ module ActiveRecord
str
end
+
+ private
+
+ def render_bind(attr)
+ value = if attr.type.binary? && attr.value
+ "<#{attr.value_for_database.to_s.bytesize} bytes of binary data>"
+ else
+ connection.type_cast(attr.value_for_database)
+ end
+
+ [attr.name, value]
+ end
end
end