From 0bc3a4325bd32136b52deb213a2429cfc0445561 Mon Sep 17 00:00:00 2001 From: Joel Meador Date: Sun, 11 Apr 2010 02:32:14 -0400 Subject: [PATCH] self referencing models don't cause stack overflows on save [#1924 state:resolved] --- .../lib/active_record/autosave_association.rb | 3 ++- .../cases/associations/self_association_test.rb | 12 ++++++++++++ activerecord/test/models/synonym.rb | 3 +++ activerecord/test/schema/schema.rb | 4 ++++ 4 files changed, 21 insertions(+), 1 deletions(-) create mode 100644 activerecord/test/cases/associations/self_association_test.rb create mode 100644 activerecord/test/models/synonym.rb diff --git a/activerecord/lib/active_record/autosave_association.rb b/activerecord/lib/active_record/autosave_association.rb index 8d40eb5..16d90a7 100644 --- a/activerecord/lib/active_record/autosave_association.rb +++ b/activerecord/lib/active_record/autosave_association.rb @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- module ActiveRecord # AutosaveAssociation is a module that takes care of automatically saving # your associations when the parent is saved. In addition to saving, it @@ -355,7 +356,7 @@ module ActiveRecord if autosave && association.marked_for_destruction? association.destroy elsif autosave != false - saved = association.save(!autosave) if association.new_record? || autosave + saved = association.save(!autosave) if (association.new_record? && self != association) || autosave if association.updated? association_id = association.send(reflection.options[:primary_key] || :id) diff --git a/activerecord/test/cases/associations/self_association_test.rb b/activerecord/test/cases/associations/self_association_test.rb new file mode 100644 index 0000000..5e907fd --- /dev/null +++ b/activerecord/test/cases/associations/self_association_test.rb @@ -0,0 +1,12 @@ +require "cases/helper" +require "models/synonym" + +class SelfAssociationTest < ActiveRecord::TestCase + def test_save_record_that_belongs_to_itself_doesnt_overflow_stack + synonym = Synonym.new + synonym.synonym = synonym + assert_nothing_raised{ + synonym.save! + } + end +end diff --git a/activerecord/test/models/synonym.rb b/activerecord/test/models/synonym.rb new file mode 100644 index 0000000..e4044a9 --- /dev/null +++ b/activerecord/test/models/synonym.rb @@ -0,0 +1,3 @@ +class Synonym < ActiveRecord::Base + belongs_to :synonym +end diff --git a/activerecord/test/schema/schema.rb b/activerecord/test/schema/schema.rb index c8e652a..37d5ba1 100644 --- a/activerecord/test/schema/schema.rb +++ b/activerecord/test/schema/schema.rb @@ -430,6 +430,10 @@ ActiveRecord::Schema.define do t.integer :book_id end + create_table :synonyms, :force => true do |t| + t.integer :synonym_id + end + create_table :tasks, :force => true do |t| t.datetime :starting t.datetime :ending -- 1.6.6