-1

このコードを実行しようとすると、「self.save...」行にIllegalContextErrorが発生します。私が間違っていることを教えてもらえますか?

初期化をいじらずにPlayerでcreateメソッドを呼び出すだけですが、初期化の一部として関連する週オブジェクトを作成したいと思います。

require 'data_mapper'

DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/prod.db")

class Player

    include DataMapper::Resource
    property :name, String, :key => true
    property :sport, String

    has n, :weeks

    def initialize(name, sport, week)
        self.save(:name => name, :sport => sport)
        self.weeks.create(:id => "#{name}#{week}", :score => 0)
    end

end

class Week

    include DataMapper::Resource
    property :id, String, :key => true
    property :week, Integer
    property :score, Integer

    belongs_to :player

end

DataMapper.finalize.auto_migrate!

Player.new("jack", "golf", 5)
4

1 に答える 1

0

これはおそらく最善の方法ではないことを理解しているので、私の方法を打ち消す前に、より良い解決策を提供してください. 私はおそらくあなたの答えを受け入れるでしょう:)

IllegalContextError は data_mapper バリデーターから発生しているようです。

バリデーターに関する data_mapper ドキュメントは、初心者がコンテキストとバリデーターに関連して理解するための多くの情報を提供しません。

これが私のハッキーな回避策です。強打演算子 (!) を使用してバリデーターをオーバーライドします。解決策は次のとおりです。

require 'data_mapper'

DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/prod.db")

class Player

    include DataMapper::Resource
    property :name, String, :key => true
    property :sport, String

    has n, :weeks

    def initialize(name, sport, week)
        self[:name] = name
        self[:sport] = sport
        self[:week] = week
        self.save!
        self.weeks.create(:id => "#{name}#{week}", :score => 0)
    end

end

class Week

    include DataMapper::Resource
    property :id, String, :key => true
    property :week, Integer
    property :score, Integer

    belongs_to :player

end

DataMapper.finalize.auto_migrate!

Player.new("jack", "golf", 5)
于 2013-02-05T07:51:14.270 に答える