diff --git a/spec/activerecord/delay_touching_spec.rb b/spec/activerecord/delay_touching_spec.rb index c2d4012..cc2d343 100644 --- a/spec/activerecord/delay_touching_spec.rb +++ b/spec/activerecord/delay_touching_spec.rb @@ -125,6 +125,15 @@ end end + it 'enters an infinite loop on polymorphic association raising an exception before create' do + person = Person.new(name: 'Foo') + person.pictures.build(owner: person, name: 'foo') + person.pictures.build(owner: person, name: 'error') + ActiveRecord::Base.delay_touching do + person.save + end + end + context 'touch: true' do before do person.pets << pet1 diff --git a/spec/support/models.rb b/spec/support/models.rb index 2816b5a..842c852 100644 --- a/spec/support/models.rb +++ b/spec/support/models.rb @@ -1,7 +1,22 @@ class Person < ActiveRecord::Base has_many :pets, inverse_of: :person + has_many :pictures, as: :owner end class Pet < ActiveRecord::Base belongs_to :person, touch: true, inverse_of: :pets end + +class Picture < ActiveRecord::Base + belongs_to :owner, polymorphic: true, touch: true + + before_save :raise_an_exception + + def raise_an_exception + if name == "error" + raise "Cannot save picture" + else + true + end + end +end diff --git a/spec/support/schema.rb b/spec/support/schema.rb index 32f0ce7..c6f82f7 100644 --- a/spec/support/schema.rb +++ b/spec/support/schema.rb @@ -16,4 +16,11 @@ t.timestamps end + create_table :pictures, :force => true do |t| + t.string :name + t.string :owner_type + t.integer :owner_id + + t.timestamps + end end