aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorTadas Tamosauskas <tadas@pdfcv.com>2013-09-28 16:10:59 +0100
committerCarlos Antonio da Silva <carlosantoniodasilva@gmail.com>2013-12-23 16:27:54 -0200
commit73bba4c1e1f7fa23aa1a126971338d94ae42398f (patch)
tree27ac306d20b5f6216e838314025f7218633dfdea /activerecord/lib
parent56510091fb8d178ec7c2391bed9fbdb9e3a54287 (diff)
downloadrails-73bba4c1e1f7fa23aa1a126971338d94ae42398f.tar.gz
rails-73bba4c1e1f7fa23aa1a126971338d94ae42398f.tar.bz2
rails-73bba4c1e1f7fa23aa1a126971338d94ae42398f.zip
Serialize postgres' hstore, json and array types correctly in AR update methods.
Fixes #12261. Closes #12395. Conflicts: activerecord/CHANGELOG.md activerecord/test/cases/adapters/postgresql/array_test.rb activerecord/test/cases/adapters/postgresql/json_test.rb
Diffstat (limited to 'activerecord/lib')
-rw-r--r--activerecord/lib/active_record/sanitization.rb9
1 files changed, 5 insertions, 4 deletions
diff --git a/activerecord/lib/active_record/sanitization.rb b/activerecord/lib/active_record/sanitization.rb
index cab8fd745a..bc78c3858a 100644
--- a/activerecord/lib/active_record/sanitization.rb
+++ b/activerecord/lib/active_record/sanitization.rb
@@ -101,7 +101,7 @@ module ActiveRecord
# # => "status = NULL , group_id = 1"
def sanitize_sql_hash_for_assignment(attrs, table)
attrs.map do |attr, value|
- "#{connection.quote_table_name_for_assignment(table, attr)} = #{quote_bound_value(value)}"
+ "#{connection.quote_table_name_for_assignment(table, attr)} = #{quote_bound_value(value, connection, columns_hash[attr.to_s])}"
end.join(', ')
end
@@ -152,15 +152,16 @@ module ActiveRecord
end
end
- def quote_bound_value(value, c = connection) #:nodoc:
- if value.respond_to?(:map) && !value.acts_like?(:string)
+ def quote_bound_value(value, c = connection, column = nil) #:nodoc:
+ db_native_type = column && (column.respond_to?(:array) && column.array || [:json, :hstore].include?(column.type) )
+ if value.respond_to?(:map) && !value.acts_like?(:string) && !db_native_type
if value.respond_to?(:empty?) && value.empty?
c.quote(nil)
else
value.map { |v| c.quote(v) }.join(',')
end
else
- c.quote(value)
+ c.quote(value, column)
end
end