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
has n, :fields was causing some sort of name conflict. Changing Field to ProfileField and :fields to :profile_fields the problem goes away.