1

在我的 Profile 类中,与 :fields 有关联是有问题的。如果它在那里并且我运行以下命令:

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

抛出以下异常:

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

为什么会这样?有解决方法吗?这是代码:

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
4

1 回答 1

1

has n, :fields 导致了某种名称冲突。将 Field 更改为 ProfileField 并将 :fields 更改为 :profile_fields 问题就消失了。

于 2013-02-13T20:12:28.837 回答