1

私のプロファイルクラスでは、: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

nがあり、:fieldsはある種の名前の競合を引き起こしていました。FieldをProfileFieldに、:fieldsを:profile_fieldsに変更すると、問題は解決します。

于 2013-02-13T20:12:28.837 に答える