aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activerecord/lib/active_record/base.rb12
-rw-r--r--activerecord/test/cases/base_test.rb4
-rw-r--r--activerecord/test/cases/duplication_test.rb43
3 files changed, 51 insertions, 8 deletions
diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb
index 9e15784f61..0d3df938e6 100644
--- a/activerecord/lib/active_record/base.rb
+++ b/activerecord/lib/active_record/base.rb
@@ -1420,7 +1420,7 @@ MSG
@attributes = coder['attributes']
@attributes_cache, @previously_changed, @changed_attributes = {}, {}, {}
@readonly = @destroyed = @marked_for_destruction = false
- @persisted = true
+ @persisted = false
_run_find_callbacks
_run_initialize_callbacks
end
@@ -1615,11 +1615,15 @@ MSG
@attributes.frozen?
end
+ def initialize_dup(other)
+ super
+ init_with 'attributes' => other.attributes
+ self
+ end
+
# Returns duplicated record with unfreezed attributes.
def dup
- obj = super
- obj.instance_variable_set('@attributes', @attributes.dup)
- obj
+ super
end
# Returns +true+ if the record is read only. Records loaded through joins with piggy-back
diff --git a/activerecord/test/cases/base_test.rb b/activerecord/test/cases/base_test.rb
index 26f388ca46..c8efabed30 100644
--- a/activerecord/test/cases/base_test.rb
+++ b/activerecord/test/cases/base_test.rb
@@ -1443,10 +1443,6 @@ class BasicsTest < ActiveRecord::TestCase
ActiveRecord::Base.logger = original_logger
end
- def test_dup
- assert !Minimalistic.new.freeze.dup.frozen?
- end
-
def test_compute_type_success
assert_equal Author, ActiveRecord::Base.send(:compute_type, 'Author')
end
diff --git a/activerecord/test/cases/duplication_test.rb b/activerecord/test/cases/duplication_test.rb
new file mode 100644
index 0000000000..610894a03e
--- /dev/null
+++ b/activerecord/test/cases/duplication_test.rb
@@ -0,0 +1,43 @@
+require "cases/helper"
+require 'models/topic'
+
+module ActiveRecord
+ class DuplicationTest < ActiveRecord::TestCase
+ fixtures :topics
+
+ def test_dup
+ assert !Minimalistic.new.freeze.dup.frozen?
+ end
+
+ def test_dup_not_persisted
+ topic = Topic.first
+ duped = topic.dup
+
+ assert !duped.persisted?, 'topic not persisted'
+ assert duped.new_record?, 'topic is new'
+ end
+
+ def test_dup_has_no_id
+ topic = Topic.first
+ duped = topic.dup
+ assert_nil duped.id
+ end
+
+ def test_clone_persisted
+ topic = Topic.first
+ cloned = topic.clone
+ assert cloned.persisted?, 'topic persisted'
+ assert !cloned.new_record?, 'topic is not new'
+ end
+
+ def test_clone_keeps_frozen
+ topic = Topic.first
+ topic.freeze
+
+ cloned = topic.clone
+ assert cloned.persisted?, 'topic persisted'
+ assert !cloned.new_record?, 'topic is not new'
+ assert cloned.frozen?, 'topic is frozen'
+ end
+ end
+end