diff options
author | Sean Griffin <sean@thoughtbot.com> | 2014-07-02 07:00:26 -0600 |
---|---|---|
committer | Sean Griffin <sean@thoughtbot.com> | 2014-07-02 07:00:26 -0600 |
commit | b6e15f9a1111469ac1c41eee23fa6ab3f2ec5be3 (patch) | |
tree | e79bbe4411c271f95ad8612550ebd4bd43b19794 /activerecord | |
parent | 5c87b5c5248154cf8aa76cce9a24a88769de022d (diff) | |
download | rails-b6e15f9a1111469ac1c41eee23fa6ab3f2ec5be3.tar.gz rails-b6e15f9a1111469ac1c41eee23fa6ab3f2ec5be3.tar.bz2 rails-b6e15f9a1111469ac1c41eee23fa6ab3f2ec5be3.zip |
Don't error when `dup`ing a record with no PK
Diffstat (limited to 'activerecord')
-rw-r--r-- | activerecord/lib/active_record/attribute_set.rb | 6 | ||||
-rw-r--r-- | activerecord/lib/active_record/core.rb | 3 | ||||
-rw-r--r-- | activerecord/test/cases/dup_test.rb | 12 |
3 files changed, 19 insertions, 2 deletions
diff --git a/activerecord/lib/active_record/attribute_set.rb b/activerecord/lib/active_record/attribute_set.rb index 8a964fb03c..df4fd31e08 100644 --- a/activerecord/lib/active_record/attribute_set.rb +++ b/activerecord/lib/active_record/attribute_set.rb @@ -52,6 +52,12 @@ module ActiveRecord super end + def reset(key) + if include?(key) + write_from_database(key, nil) + end + end + protected attr_reader :attributes diff --git a/activerecord/lib/active_record/core.rb b/activerecord/lib/active_record/core.rb index 224112b559..30b8485c8b 100644 --- a/activerecord/lib/active_record/core.rb +++ b/activerecord/lib/active_record/core.rb @@ -315,9 +315,8 @@ module ActiveRecord ## def initialize_dup(other) # :nodoc: - pk = self.class.primary_key @attributes = @attributes.dup - @attributes.write_from_database(pk, nil) + @attributes.reset(self.class.primary_key) run_callbacks(:initialize) unless _initialize_callbacks.empty? diff --git a/activerecord/test/cases/dup_test.rb b/activerecord/test/cases/dup_test.rb index 409d9a82e2..638cffe0e6 100644 --- a/activerecord/test/cases/dup_test.rb +++ b/activerecord/test/cases/dup_test.rb @@ -141,5 +141,17 @@ module ActiveRecord ensure Topic.default_scopes = prev_default_scopes end + + def test_dup_without_primary_key + klass = Class.new(ActiveRecord::Base) do + self.table_name = 'parrots_pirates' + end + + record = klass.create! + + assert_nothing_raised do + record.dup + end + end end end |