stack overflow in datamapper from has n relationship

187 views Asked by At

In my Profile class the has n association with :fields is problematic. If it's there and I run the following:

user = User.create
user.profiles << Profiles.new
user.save
Profile.all

The following exception is thrown:

SystemStackError: stack level too deep
    from /Users/jon/.rvm/gems/ruby-1.9.3-p194/gems/dm-core-1.2.0/lib/dm-core/support/ordered_set.rb:319

Why is this happening? Is there a workaround? Here is the code:

require 'rubygems'
require 'data_mapper'
require 'dm-timestamps'
require 'active_support/core_ext'
DataMapper::Model.raise_on_save_failure = true
class User
  include DataMapper::Resource
    property :id, String, :default => lambda {|r,p| SecureRandom.uuid}, :key=>true
    property :givenName, String, :length => 255, :default => ""
    property :surname, String, :length => 255, :default => ""
    property :isTestUser, Boolean, :default => false
    has n, :organizations
    has n, :profiles

    def default_profile
        profiles.all(:organization => nil).first
    end

end

class Profile
    include DataMapper::Resource
    property :id, Serial
    belongs_to :organization, :required => false
    belongs_to :user
    has n, :fields # if i remove this line then Profile.all doesn't puke, if I have this line then any call to Profile.all fails with stack overflow.
end

class Field
    include DataMapper::Resource
    property :id, Serial
    property :fieldType, String, :length => 200, :required => true
    property :valueType, String, :length => 200, :required => true
    property :value, String, :length => 500, :required => true
    belongs_to :profile
end

class Organization
    include DataMapper::Resource

    property :id,   Serial
    property :name, String
    timestamps :at

    belongs_to :user, :required=>false

end
1

There are 1 answers

0
Jon On BEST ANSWER

has n, :fields was causing some sort of name conflict. Changing Field to ProfileField and :fields to :profile_fields the problem goes away.