This project is archived and is in readonly mode.

#301 ✓resolved
Matt Mower

SystemStackError with has_one

Reported by Matt Mower | June 2nd, 2008 @ 09:37 PM

Upgrading a project of mine from Rails 2.0.3 to Rails 2.1 I discovered a number of specs started throwing errors like:

Exception raised:

Class:

Message: <"stack level too deep">

---Backtrace---

./test/cases/../../lib/../../activesupport/lib/active_support/callbacks.rb:272:in `run_callbacks'

./test/cases/../../lib/active_record/validations.rb:929:in `valid_without_callbacks?'

./test/cases/../../lib/active_record/callbacks.rb:267:in `valid?'

./test/cases/../../lib/active_record/associations/association_proxy.rb:177:in `send'

./test/cases/../../lib/active_record/associations/association_proxy.rb:177:in `method_missing'

./test/cases/../../lib/active_record/associations.rb:1165:in `validate_associated_records_for_inverse'

./test/cases/../../lib/../../activesupport/lib/active_support/callbacks.rb:173:in `send'

./test/cases/../../lib/../../activesupport/lib/active_support/callbacks.rb:173:in `evaluate_method'

./test/cases/../../lib/../../activesupport/lib/active_support/callbacks.rb:161:in `call'

./test/cases/../../lib/../../activesupport/lib/active_support/callbacks.rb:90:in `run'

./test/cases/../../lib/../../activesupport/lib/active_support/callbacks.rb:90:in `each'

./test/cases/../../lib/../../activesupport/lib/active_support/callbacks.rb:90:in `send'

./test/cases/../../lib/../../activesupport/lib/active_support/callbacks.rb:90:in `run'

./test/cases/../../lib/../../activesupport/lib/active_support/callbacks.rb:272:in `run_callbacks'

./test/cases/../../lib/active_record/validations.rb:929:in `valid_without_callbacks?'

./test/cases/../../lib/active_record/callbacks.rb:267:in `valid?'

./test/cases/../../lib/active_record/associations/association_proxy.rb:177:in `send'

this relates to an after_create callback on one of the models which has a self-referential association:

class Relationship

has_one :inverse, :class_name => 'Relationship', :foreign_key => 'inverse_id', :dependent => :nullify

def after_create

if !self.inverse

self.inverse = Relationship.find_for( contact_id, user_id )

if self.inverse

self.save!

self.inverse.inverse = self

self.inverse.save!

end

end

end

end

I have reduced the problem to a minimal test case which I have added to the appropriate test case in the ActiveRecord test suite. I enclose a patch that adds the model, fixture, and test.

To recap this behaviour functioned properly in Rails 2.0.3 but is broken in 2.1rc and 2.1final.

end

Comments and changes to this ticket

Create your profile

Help contribute to this project by taking a few moments to create your personal profile. Create your profile »

<h2 style="font-size: 14px">Tickets have moved to Github</h2>

The new ticket tracker is available at <a href="https://github.com/rails/rails/issues">https://github.com/rails/rails/issues</a>

Referenced by

Pages