数据映射器中的堆栈溢出来自has n关系

时间:2013-02-13 03:39:57

标签: ruby ruby-datamapper datamapper-1.2

在我的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

1 个答案:

答案 0 :(得分:1)

有n,:字段导致某种名称冲突。将字段更改为ProfileField和:字段:profile_fields问题消失。