gpt4 book ai didi

ruby - 复合主键仅用于访问记录,不用于在 data_mapper 中保存记录

转载 作者:数据小太阳 更新时间:2023-10-29 08:50:27 25 4
gpt4 key购买 nike

我有一个应用程序可以跟踪玩家在健身计划中的进度。所以每个玩家都有多个星期使用相同的 :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)

最佳答案

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

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

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"))

并且您的示例代码可以正常运行

关于ruby - 复合主键仅用于访问记录,不用于在 data_mapper 中保存记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14390187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com