-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 文档并没有为新手提供太多信息来理解上下文以及与验证器的关系。

这是我的hacky解决方法。我使用 bang 运算符 (!) 覆盖了验证器。解决方法如下。

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 回答