aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorPrathamesh Sonpatki <csonpatki@gmail.com>2015-01-11 13:53:28 +0530
committerPrathamesh Sonpatki <csonpatki@gmail.com>2015-01-18 20:00:57 +0530
commit0fcd4cf5c26c470623eef9af72a134ef6ba1a701 (patch)
treef1b09c2bcc6e467a0346de158c4218df65e80c46 /activerecord
parent8a87ebfd8f5f3ca2e7d7c063f8cc98158896e475 (diff)
downloadrails-0fcd4cf5c26c470623eef9af72a134ef6ba1a701.tar.gz
rails-0fcd4cf5c26c470623eef9af72a134ef6ba1a701.tar.bz2
rails-0fcd4cf5c26c470623eef9af72a134ef6ba1a701.zip
Run SQL only if attribute changed for update_attribute method
- This is based on https://github.com/rails/rails/issues/18400 but tackling same issue with update_attribute method instead of update method.
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/CHANGELOG.md4
-rw-r--r--activerecord/lib/active_record/persistence.rb2
-rw-r--r--activerecord/test/cases/persistence_test.rb10
3 files changed, 15 insertions, 1 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md
index bfd3073293..d8f29a77b4 100644
--- a/activerecord/CHANGELOG.md
+++ b/activerecord/CHANGELOG.md
@@ -1,3 +1,7 @@
+* Don't run SQL if attribute value is not changed for update_attribute method.
+
+ *Prathamesh Sonpatki*
+
* `time` columns can now affected by `time_zone_aware_attributes`. If you have
set `config.time_zone` to a value other than `'UTC'`, they will be treated
as in that time zone by default in Rails 5.1. If this is not the desired
diff --git a/activerecord/lib/active_record/persistence.rb b/activerecord/lib/active_record/persistence.rb
index 6306a25745..714d36e7c0 100644
--- a/activerecord/lib/active_record/persistence.rb
+++ b/activerecord/lib/active_record/persistence.rb
@@ -246,7 +246,7 @@ module ActiveRecord
name = name.to_s
verify_readonly_attribute(name)
send("#{name}=", value)
- save(validate: false)
+ save(validate: false) if changed?
end
# Updates the attributes of the model from the passed-in hash and saves the
diff --git a/activerecord/test/cases/persistence_test.rb b/activerecord/test/cases/persistence_test.rb
index d6816041bc..2803ad2de0 100644
--- a/activerecord/test/cases/persistence_test.rb
+++ b/activerecord/test/cases/persistence_test.rb
@@ -356,6 +356,16 @@ class PersistenceTest < ActiveRecord::TestCase
assert_equal("David", topic_reloaded.author_name)
end
+ def test_update_attribute_does_not_run_sql_if_attribute_is_not_changed
+ klass = Class.new(Topic) do
+ def self.name; 'Topic'; end
+ end
+ topic = klass.create(title: 'Another New Topic')
+ assert_queries(0) do
+ topic.update_attribute(:title, 'Another New Topic')
+ end
+ end
+
def test_delete
topic = Topic.find(1)
assert_equal topic, topic.delete, 'topic.delete did not return self'