diff options
author | Rafael Mendonça França <rafaelmfranca@gmail.com> | 2012-11-18 23:25:13 -0200 |
---|---|---|
committer | Rafael Mendonça França <rafaelmfranca@gmail.com> | 2012-11-18 23:25:13 -0200 |
commit | 0cc9c1255d8bc5a2f7d4abb8553e9eefabf3deac (patch) | |
tree | 5283bc0dd4515dc35646ae691adf6c9733756b9a | |
parent | f460835dd5ebcede6f02e0459a7e6f8271b9047c (diff) | |
parent | 70fa756ddb83684a05c840ff16e6b57cff5c5048 (diff) | |
download | rails-0cc9c1255d8bc5a2f7d4abb8553e9eefabf3deac.tar.gz rails-0cc9c1255d8bc5a2f7d4abb8553e9eefabf3deac.tar.bz2 rails-0cc9c1255d8bc5a2f7d4abb8553e9eefabf3deac.zip |
Merge pull request #3023 from Tho85/preserve_sti_type
AR::Base.becomes should not change the STI type
Conflicts:
activerecord/CHANGELOG.md
-rw-r--r-- | activerecord/CHANGELOG.md | 7 | ||||
-rw-r--r-- | activerecord/lib/active_record/persistence.rb | 13 | ||||
-rw-r--r-- | activerecord/test/cases/persistence_test.rb | 13 |
3 files changed, 31 insertions, 2 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 82e90e665b..082e3d1089 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,5 +1,12 @@ ## Rails 4.0.0 (unreleased) ## +* Don't change STI type when calling `ActiveRecord::Base#becomes`. + Add `ActiveRecord::Base#becomes!` with the previous behavior. + + See #3023 for more information. + + *Thomas Hollstegge* + * `rename_index` can be used inside a `change_table` block. change_table :accounts do |t| diff --git a/activerecord/lib/active_record/persistence.rb b/activerecord/lib/active_record/persistence.rb index 8e749772a1..45f5406cc3 100644 --- a/activerecord/lib/active_record/persistence.rb +++ b/activerecord/lib/active_record/persistence.rb @@ -155,7 +155,18 @@ module ActiveRecord became.instance_variable_set("@new_record", new_record?) became.instance_variable_set("@destroyed", destroyed?) became.instance_variable_set("@errors", errors) - became.public_send("#{klass.inheritance_column}=", klass.name) unless self.class.descends_from_active_record? + became + end + + # Wrapper around +becomes+ that also changes the instance's sti column value. + # This is especially useful if you want to persist the changed class in your + # database. + # + # Note: The old instance's sti column value will be changed too, as both objects + # share the same set of attributes. + def becomes!(klass) + became = becomes(klass) + became.public_send("#{klass.inheritance_column}=", klass.sti_name) unless self.class.descends_from_active_record? became end diff --git a/activerecord/test/cases/persistence_test.rb b/activerecord/test/cases/persistence_test.rb index 4b938da5c4..b2609f6395 100644 --- a/activerecord/test/cases/persistence_test.rb +++ b/activerecord/test/cases/persistence_test.rb @@ -280,12 +280,23 @@ class PersistencesTest < ActiveRecord::TestCase def test_update_sti_type assert_instance_of Reply, topics(:second) - topic = topics(:second).becomes(Topic) + topic = topics(:second).becomes!(Topic) assert_instance_of Topic, topic topic.save! assert_instance_of Topic, Topic.find(topic.id) end + def test_preserve_original_sti_type + reply = topics(:second) + assert_equal "Reply", reply.type + + topic = reply.becomes(Topic) + assert_equal "Reply", reply.type + + assert_instance_of Topic, topic + assert_equal "Reply", topic.type + end + def test_delete topic = Topic.find(1) assert_equal topic, topic.delete, 'topic.delete did not return self' |