2

フィットネスプログラムでのプレーヤーの進捗状況を追跡するアプリがあります。したがって、すべてのプレーヤーは同じ:week_idで複数の週を持ちます

週IDとbelongs_to関係を組み合わせると、週レコードの複合主キーになります。

ただし、異なるプレーヤーに属する同じweek_idで2週間を作成しようとすると、「列week_idは一意ではありません」というエラーが発生します。

週のレコードを取得する場合、それを取得するには2つの引数(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

だから私は私の週のモデルにそのように小さな変更を加えることになりました

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文字列は、:idが「jack」のプレーヤーの最初のレコードの「jack1」のようになります。

これがdata_mapperの方法であるかどうかはわかりませんが、機能します。

于 2013-01-24T06:46:55.213 に答える