Lighthouse has a new layout. Prefer the old one? Return to the old layout, and switch back any time from the link at the top of each page.

This project is archived and is in readonly mode.

SystemStackError with has_one

#301

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

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

State: resolved
Milestone: none
Assigned to: Pratik Pratik
Importance: none

Activity

  1. Jan De Poorter
    Jan De Poorter

    I added (in collaboration with lifo on IRC) a patch which adds :validate to has_many, has_one, habtm associations, to disable the automatic validation, which is why this problem occurs.

    June 3rd, 2008 @ 11:27 AM

  2. Matt Mower
    Matt Mower

    Thanks Jan.

    I would like to mention that Jan also came up with a useful workaround which is to redefine the method that the has_one is generating stubbing it out. In my case this is "validate_associated_records_for_inverse".

    Until :validate => false is in place the workaround may help.

    June 3rd, 2008 @ 11:31 AM

  3. Pratik
    Pratik
    • Assigned user set to Pratik

    June 9th, 2008 @ 11:39 AM

  4. Luke Redpath
  5. Drew Blas
    Drew Blas

    +1

    ...Although I echo the sentiment of others that this should NOT be enabled by default. There is no proper documentation of it and the expected behavior is to use validates_associated...that's what validations are for.

    June 9th, 2008 @ 10:34 PM

  6. Pratik
    Pratik

    A few changes needed :

    • It should be possible to use one of the existing table/model.
    • Could you please add :validate option to belongs_to as well ?

    Catch me on IRC if you have any questions.

    Thanks!

    June 10th, 2008 @ 05:49 PM

  7. Jan De Poorter
    Jan De Poorter

    @Pratik: I did what you asked, patch attached

    June 11th, 2008 @ 12:12 PM

  8. Repository
    Repository
    • State changed from new to resolved

    (from [7f140bbddaf70abc61570f6cfdcbfba5771ffc78]) Add :validate option to associations. [#301 state:resolved]

    Signed-off-by: Pratik Naik

    http://github.com/rails/rails/co...

    June 11th, 2008 @ 12:28 PM

  9. Repository
    Repository

    (from [23223ce415da13a09287325d114ce2d2e3923edf]) Add :validate option to associations. [#301 state:resolved]

    Signed-off-by: Pratik Naik

    http://github.com/rails/rails/co...

    June 11th, 2008 @ 05:14 PM

  10. Andrea Campi
    Andrea Campi
    • Tag set to 2-3-stable, activerecord, bug, callback, has_one, patch

    October 16th, 2010 @ 11:38 PM