2

我有一个应用程序可以跟踪玩家在健身计划中的进度。所以每个玩家都有多个相同的 :week_id 周

Week_id 结合belongs_to 关系是Week 记录的复合主键。

但是,当我尝试使用属于不同玩家的相同 week_id 创建两个星期时,我收到“column week_id is not unique”错误。

我觉得我走在正确的轨道上,因为当我想获取周记录时,它告诉我需要两个参数来获取它 - week_id 和 player_id。

我可能在这里遗漏了一些简单的东西。我希望你能给我看。

require "rubygems"  
require "json"
require "sqlite3"
require "data_mapper"
require "bigdecimal"



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

DataMapper::Model.raise_on_save_failure = true

class Player

    include DataMapper::Resource

    property :name, String, :key => true
    property :age, Integer

    has n, :weeks

end

class Week

    include DataMapper::Resource

    property :week_id, Integer, :key => true
    property :score, Integer

    belongs_to :player, :key => true

end

DataMapper.finalize.auto_migrate!

@jack = Player.create(:name => "jack")
@jack.weeks.create(:week_id => 1)

@jill = Player.create(:name => "jill")
@jill.weeks.create(:week_id => 1)
4

2 回答 2

2

看起来你已经想出了一个解决方案,但我会继续为后代发布另一个答案,因为我遇到了同样的问题。

似乎将 ':player_name' 声明为作为键的属性以及使用 'belongs_to' 声明,您最终会使用相同的 SQL 来创建表,但它也认识到 week_id 是复合键的一部分,并且不需要是唯一的。(看来 DataMapper 的复合键在“property”和“belongs_to”声明之间存在问题。)

class Week

    include DataMapper::Resource

    property :week_id, Integer, :key => true
    property :player_name, String, :key => true
    property :score, Integer

    belongs_to :player, :key => true

end

产生以下 SQL 来创建表:

~ (0.000000) CREATE TABLE "weeks" ("week_id" INTEGER NOT NULL, "player_name" VARCHAR(50) NOT NULL, "score" INTEGER, PRIMARY KEY("week_id", "player_name"))

而且您的示例代码可以正常工作

于 2013-06-12T06:00:32.740 回答
1

所以我最终像这样对我的 Week 模型进行了一个小改动

class Week

    include DataMapper::Resource

    property :id, String, :key => true
    property :week_id, Integer
    property :score, Integer

    belongs_to :player

end

每当我创建一个新的 Player 模型时,我都会连接外键和 week_id 以创建 id 字符串

因此,对于 :id 为 "jack" 的玩家的第一条记录,我的 id 字符串看起来像 "jack1"

不确定这是否是 data_mapper 方式,但它有效。

于 2013-01-24T06:46:55.213 回答