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.

There was a problem

You must be a member of this account.

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