diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2013-02-24 22:16:52 -0800 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2013-02-24 22:16:52 -0800 |
commit | 45321a69b3c01ce8a4cfef6cdf13381d73e10cd3 (patch) | |
tree | 2303416f9cca19dd5740462e92e900100d718732 | |
parent | 3285c76557f1c36aba4de17d3440e16220cd87d8 (diff) | |
parent | a53935dfa0538fba0ab805f1a2c4ca2c421ed5e1 (diff) | |
download | rails-45321a69b3c01ce8a4cfef6cdf13381d73e10cd3.tar.gz rails-45321a69b3c01ce8a4cfef6cdf13381d73e10cd3.tar.bz2 rails-45321a69b3c01ce8a4cfef6cdf13381d73e10cd3.zip |
Merge pull request #9246 from Noemj/update_prepared_statements
Changed update to use prepared statements
-rw-r--r-- | activerecord/lib/active_record/persistence.rb | 15 | ||||
-rw-r--r-- | activerecord/test/cases/adapter_test.rb | 14 |
2 files changed, 26 insertions, 3 deletions
diff --git a/activerecord/lib/active_record/persistence.rb b/activerecord/lib/active_record/persistence.rb index 26c11b50a2..57ae78275d 100644 --- a/activerecord/lib/active_record/persistence.rb +++ b/activerecord/lib/active_record/persistence.rb @@ -422,13 +422,22 @@ module ActiveRecord # Returns the number of affected rows. def update_record(attribute_names = @attributes.keys) attributes_with_values = arel_attributes_with_values_for_update(attribute_names) - if attributes_with_values.empty? 0 else klass = self.class - stmt = klass.unscoped.where(klass.arel_table[klass.primary_key].eq(id)).arel.compile_update(attributes_with_values) - klass.connection.update stmt + column_hash = klass.connection.schema_cache.columns_hash klass.table_name + db_columns_with_values = attributes_with_values.map { |attr,value| + real_column = column_hash[attr.name] + [real_column, value] + } + bind_attrs = attributes_with_values.dup + bind_attrs.keys.each_with_index do |column, i| + real_column = db_columns_with_values[i].first + bind_attrs[column] = klass.connection.substitute_at(real_column, i) + end + stmt = klass.unscoped.where(klass.arel_table[klass.primary_key].eq(id)).arel.compile_update(bind_attrs) + klass.connection.update stmt, 'SQL', db_columns_with_values end end diff --git a/activerecord/test/cases/adapter_test.rb b/activerecord/test/cases/adapter_test.rb index f9149c1819..0af7cbf74f 100644 --- a/activerecord/test/cases/adapter_test.rb +++ b/activerecord/test/cases/adapter_test.rb @@ -1,4 +1,5 @@ require "cases/helper" +require "models/book" module ActiveRecord class AdapterTest < ActiveRecord::TestCase @@ -6,6 +7,19 @@ module ActiveRecord @connection = ActiveRecord::Base.connection end + ## + # PostgreSQL does not support null bytes in strings + unless current_adapter?(:PostgreSQLAdapter) + def test_update_prepared_statement + b = Book.create(name: "my \x00 book") + b.reload + assert_equal "my \x00 book", b.name + b.update_attributes(name: "my other \x00 book") + b.reload + assert_equal "my other \x00 book", b.name + end + end + def test_tables tables = @connection.tables assert tables.include?("accounts") |