From 226116a44010f4da857f6b26d73bec2618dea890 Mon Sep 17 00:00:00 2001 From: Yuriy Ustushenko Date: Sat, 20 Jan 2018 16:55:31 +0700 Subject: Clear the transaction state when AR object is duped --- activerecord/CHANGELOG.md | 6 ++++++ activerecord/lib/active_record/core.rb | 6 ++++-- activerecord/test/cases/dup_test.rb | 16 ++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) (limited to 'activerecord') diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index e2dc8045e2..41a9c8cc89 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,9 @@ +* Clear the transaction state when AR object is duped. + + Fixes #31670. + + *Yuriy Ustushenko* + * Support for PostgreSQL foreign tables. *fatkodima* diff --git a/activerecord/lib/active_record/core.rb b/activerecord/lib/active_record/core.rb index 2c65f618dc..e1a0b2ecf8 100644 --- a/activerecord/lib/active_record/core.rb +++ b/activerecord/lib/active_record/core.rb @@ -382,8 +382,10 @@ module ActiveRecord _run_initialize_callbacks - @new_record = true - @destroyed = false + @new_record = true + @destroyed = false + @_start_transaction_state = {} + @transaction_state = nil super end diff --git a/activerecord/test/cases/dup_test.rb b/activerecord/test/cases/dup_test.rb index 73da31996e..59c3331595 100644 --- a/activerecord/test/cases/dup_test.rb +++ b/activerecord/test/cases/dup_test.rb @@ -3,6 +3,7 @@ require "cases/helper" require "models/reply" require "models/topic" +require "models/movie" module ActiveRecord class DupTest < ActiveRecord::TestCase @@ -157,5 +158,20 @@ module ActiveRecord record.dup end end + + def test_dup_record_not_persisted_after_rollback_transaction + movie = Movie.new(name: "test") + + assert_raises(ActiveRecord::RecordInvalid) do + Movie.transaction do + movie.save! + duped = movie.dup + duped.name = nil + duped.save! + end + end + + assert !movie.persisted? + end end end -- cgit v1.2.3