Skip to content

Commit

Permalink
Enable update_column(s) for the primary key attribute.
Browse files Browse the repository at this point in the history
Didn't work before because it updated the model-in-memory first, so the DB query couldn't find the record.
  • Loading branch information
henrik committed Oct 28, 2012
1 parent 5bbe245 commit 1849665
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 1 deletion.
4 changes: 4 additions & 0 deletions activerecord/CHANGELOG.md
@@ -1,5 +1,9 @@
## Rails 4.0.0 (unreleased) ##

* Fix bug where `update_columns` and `update_column` would not let you update the primary key column.

*Henrik Nyh*

* The `create_table` method raises an `ArgumentError` when the primary key column is redefined.
Fix #6378

Expand Down
4 changes: 3 additions & 1 deletion activerecord/lib/active_record/persistence.rb
Expand Up @@ -224,11 +224,13 @@ def update_columns(attributes)
verify_readonly_attribute(key.to_s)
end

updated_count = self.class.where(self.class.primary_key => id).update_all(attributes)

attributes.each do |k,v|
raw_write_attribute(k,v)
end

self.class.where(self.class.primary_key => id).update_all(attributes) == 1
updated_count == 1
end

# Initializes +attribute+ to zero if +nil+ and adds the value passed as +by+ (default is 1).
Expand Down
13 changes: 13 additions & 0 deletions activerecord/test/cases/persistence_test.rb
Expand Up @@ -592,6 +592,19 @@ def test_update_columns_with_one_changed_and_one_updated
assert_equal 'super_title', t.title
end

def test_update_columns_changing_id
topic = Topic.find(1)
topic.update_columns(id: 123)
assert_equal 123, topic.id
topic.reload
assert_equal 123, topic.id
end

def test_update_columns_returns_boolean
topic = Topic.find(1)
assert_equal true, topic.update_columns(title: "New title")
end

def test_update_attributes
topic = Topic.find(1)
assert !topic.approved?
Expand Down

0 comments on commit 1849665

Please sign in to comment.