Leo Leo - 4 months ago 37
Ruby Question

Stack level too deep error in Ruby on Rails

I'm having a stack level too deep error using Ruby 1.8.7 with Rails
3.0.4 and with the rails console I performed the following commands.

leo%>rails console
Loading development environment (Rails 3.0.4)
ruby-1.8.7-head > leo = Organization.find(1)

SystemStackError: stack level too deep
from /app/models/organization.rb:105:in `parents'


Here is the object that is having issues..

class Organization < ActiveRecord::Base

has_many :group_organizations, :dependent =>
:delete_all
has_many :groups, :through => :group_organizations

has_many :orders
has_many :product_contracts

has_many :people
accepts_nested_attributes_for :people

has_many :addresses
accepts_nested_attributes_for :addresses

has_many :organizations
has_many :departments
has_many :organization_credits

has_many :documents

validates_presence_of :name



def self.parents
@organizations = Organization.where("is_company = ?",true)
#@organization_parents = []
select_choice = I18n.t("select") + " "+ I18n.t("segments.description")
@organization_parents = [select_choice]
for organization in @organizations
@organization_parents << [organization.name, organization.id]
end
return @organization_parents
end

Leo Leo
Answer

I've found the solution to this issue...

I'm using Rails 3 and my class looks like this (and the problematic methods was this too)

class Organization < ActiveRecord::Base
  def self.parents
    @organizations = self.find :all, :conditions => ['is_company = ? ',true]
    select_choice = I18n.t("select") + " "+ I18n.t("segments.description")
    @organization_parents = [select_choice]
    for organization in @organizations
      @organization_parents << [organization.name, organization.id]
    end
    return @organization_parents
  end 
  #...
end

I did have to hack a lot in the code to find out something was wrong with the named_scope on the line

@organizations = self.find :all, :conditions => ['is_company = ? ',true]

So I had to change it to something like this

@organizations = Organization.where("is_company = ?",true)

But it was wrong too.. So I decided to add an scope for this below the class name so the final code looks like this:

class Organization < ActiveRecord::Base
  scope :company, where("is_company = ?",true)

  def self.parents
    @organizations = self.company
    select_choice = I18n.t("select") + " "+ I18n.t("segments.description")
    @organization_parents = [select_choice]
    for organization in @organizations
      @organization_parents << [organization.name, organization.id]
    end
    return @organization_parents
  end 
  #...
end

So using this line with the scope

@organizations = self.company

it worked flawlessly in every part of the code.

I was wondering if the named_scope is deprecated when using class methods or they are not supported from now and throws an error and not a warning before

Thanks for your help Leo

Comments