提交 70fa756d 编写于 作者: T Thomas Hollstegge

AR::Base.becomes should not change the STI type

If you want to change the STI type too, use AR::Base.becomes! instead
上级 ee941283
## Rails 4.0.0 (unreleased) ##
* Don't change STI type when calling ActiveRecord::Base#becomes, add
ActiveRecord::Base#becomes!
See #3023.
*Thomas Hollstegge*
* `#pluck` can be used on a relation with `select` clause. Fix #7551
Example:
......
......@@ -155,7 +155,18 @@ def becomes(klass)
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
......
......@@ -280,12 +280,23 @@ def test_update_for_record_with_only_primary_key
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'
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册