From a3c3cfdd0ebba26bb9dfc0bfd4e23a5f336730c0 Mon Sep 17 00:00:00 2001
From: Carlos Antonio da Silva <carlosantoniodasilva@gmail.com>
Date: Thu, 6 Dec 2012 23:09:11 -0200
Subject: Unscope update_column(s) query to ignore default scope

When applying default_scope to a class with a where clause, using
update_column(s) could generate a query that would not properly update
the record due to the where clause from the default_scope being applied
to the update query.

    class User < ActiveRecord::Base
      default_scope where(active: true)
    end

    user = User.first
    user.active = false
    user.save!

    user.update_column(:active, true) # => false

In this situation we want to skip the default_scope clause and just
update the record based on the primary key. With this change:

    user.update_column(:active, true) # => true

Backport of #8436 fix.

Conflicts:
	activerecord/CHANGELOG.md
	activerecord/lib/active_record/persistence.rb
	activerecord/test/cases/persistence_test.rb
---
 activerecord/test/cases/persistence_test.rb | 8 ++++++++
 1 file changed, 8 insertions(+)

(limited to 'activerecord/test')

diff --git a/activerecord/test/cases/persistence_test.rb b/activerecord/test/cases/persistence_test.rb
index a35cb3c4a5..00dc1f6d72 100644
--- a/activerecord/test/cases/persistence_test.rb
+++ b/activerecord/test/cases/persistence_test.rb
@@ -519,6 +519,14 @@ class PersistencesTest < ActiveRecord::TestCase
     assert return_value
   end
 
+  def test_update_column_with_default_scope
+    developer = DeveloperCalledDavid.first
+    developer.name = 'John'
+    developer.save!
+
+    assert developer.update_column(:name, 'Will'), 'did not update record due to default scope'
+  end
+
   def test_update_attributes
     topic = Topic.find(1)
     assert !topic.approved?
-- 
cgit v1.2.3