2012-05-08 10 views
0

私が参照している具体的な例はここにあります。 Gridテーブルの行をDriverテーブルのGridプロパティの値に使用したいとします。しかし、Gridテーブルの更新情報をDriverテーブルのGridプロパティに保持することはできません。 Raceテーブルの行をDriverテーブルのRaceプロパティの値にしたいとします。Datamapperを使用して、あるテーブルの行を別のテーブルのプロパティとして使用するにはどうすればよいですか?

ここにdatamapperのコードがあります。 IRBでは

require "rubygems" 
require "json" 
require "sinatra" 
require "sinatra/reloader" 
require "sqlite3" 
require "data_mapper" 

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


class Driver 
    include DataMapper::Resource 
    property :id, String, :key => true 
    property :ptd, Integer 
    property :races, Integer 
    property :grid, Object 
    property :race, Object 
    property :hcScore, Integer 
    property :domScore, Integer 
end 

class Grid 
    include DataMapper::Resource 
    property :id, String, :key => true 
    property :AUS_Q, Integer 
    property :MAL_Q, Integer 
    property :CHI_Q, Integer 
    property :BAH_Q, Integer 
end 

class Race 
    include DataMapper::Resource 
    property :id, String, :key => true 
    property :AUS_R, Integer 
    property :MAL_R, Integer 
    property :CHI_R, Integer 
    property :BAH_R, Integer 
end 

class Team 

    include DataMapper::Resource 
    property :id, String, :key => true 
    property :domScore, Integer 
    property :drivers, Object 
end 

DataMapper.finalize.auto_migrate! 

あなたが見ることができるように私は

irb(main):001:0> require "./season.rb" 
=> true 
irb(main):002:0> v = Driver.create id: "VET" 
=> #<Driver @id="VET" @ptd=nil @races=nil @grid=nil @race=nil @hcScore=nil @domScore=nil> 
irb(main):003:0> g = Grid.create id: "VET" 
=> #<Grid @id="VET" @AUS_Q=nil @MAL_Q=nil @CHI_Q=nil @BAH_Q=nil> 
irb(main):004:0> v.grid = Grid.get "VET" 
=> #<Grid @id="VET" @AUS_Q=nil @MAL_Q=nil @CHI_Q=nil @BAH_Q=nil> 
irb(main):005:0> v.save 
=> true 
irb(main):006:0> g.update(:AUS_Q => 6) 
=> true 
irb(main):007:0> v 
=> #<Driver @id="VET" @ptd=nil @races=nil @grid=#<Grid @id="VET" @AUS_Q=nil @MAL_Q=nil @CHI_Q=nil @BAH_Q=nil> @race=nil @hcScore=nil @domScore=nil> 
irb(main):008:0> Grid.get "VET" 
=> #<Grid @id="VET" @AUS_Q=6 @MAL_Q=nil @CHI_Q=nil @BAH_Q=nil> 
irb(main):009:0> AUS_Q = 6 in the Grid table but in the Driver table it continues to be nil! 

ようなことを行います - ドライバテーブルのAUS_Qは、私は、グリッドテーブルに6ようにそれを設定していてもnilをであり続けています。

私はそれを間違ってやっていますし、これを行うより簡単な方法があります。私はすべての訂正とスマックダウンをお勧めします。

答えて

1

私はあなたがリソース間の関連付けを作成するためにbelongs_toを使用することを示唆している、とあなたはこのように、アイデンティティ・マップを使用することになります。

require "sqlite3" 
require "data_mapper" 

class Driver 
    include DataMapper::Resource 
    property :id, String, :key => true 
    belongs_to :grid, :required => false 
end 

class Grid 
    include DataMapper::Resource 
    property :id, String, :key => true 
    property :AUS_Q, Integer 
end 

DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/season.db") 
DataMapper.finalize.auto_migrate! 

DataMapper.repository(:default) do 
    v = Driver.create id: "VET" 
    g = Grid.create id: "VET" 
    v.grid = Grid.get "VET" 
    v.save 
    g.update(:AUS_Q => 6) 
    puts v.grid.AUS_Q 
    puts Grid.get("VET").AUS_Q 
end 

DataMapper.repository(:default) doによって開始されたブロック内のあなたが行うすべてはアイデンティティ・マップを使用します。したがって、データベース内の同一のオブジェクトは、メモリ内の同一のオブジェクトをもたらすことになる。

+0

belongs_toを使用すると、それにリンクしているテーブルに後にnが必要ですか? また、この関連付けを行う利点は何ですか? DataMapper.repositoryブロックがこの関係をどのように使用するかはわかりません。 – JoeyC

+1

必要がある場合にのみ、 'has n 'を他のテーブルに追加します。この関連付けを行う利点は、実際に存在するアソシエーション(実際に存在する)をDMアソシエーションにマッピングし、DMを最大限に活用することです。そのブロックは、データベース内の同じオブジェクトがメモリ内の同一のオブジェクトに対応することを保証するためのものです。つまり、 'Grid'オブジェクトで' AUS_Q'を変更すると、そのオブジェクトに関連付けられた 'Driver'オブジェクトが変更を認識します。 –

+0

これは良い答えです。申し訳ありません、それに戻ってくるのに私はずっと時間がかかりました! – JoeyC

関連する問題