私が参照している具体的な例はここにあります。 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をであり続けています。
私はそれを間違ってやっていますし、これを行うより簡単な方法があります。私はすべての訂正とスマックダウンをお勧めします。
belongs_toを使用すると、それにリンクしているテーブルに後にnが必要ですか? また、この関連付けを行う利点は何ですか? DataMapper.repositoryブロックがこの関係をどのように使用するかはわかりません。 – JoeyC
必要がある場合にのみ、 'has n 'を他のテーブルに追加します。この関連付けを行う利点は、実際に存在するアソシエーション(実際に存在する)をDMアソシエーションにマッピングし、DMを最大限に活用することです。そのブロックは、データベース内の同じオブジェクトがメモリ内の同一のオブジェクトに対応することを保証するためのものです。つまり、 'Grid'オブジェクトで' AUS_Q'を変更すると、そのオブジェクトに関連付けられた 'Driver'オブジェクトが変更を認識します。 –
これは良い答えです。申し訳ありません、それに戻ってくるのに私はずっと時間がかかりました! – JoeyC