0

私が言及している特定のインスタンスはここにあります。Gridテーブルの行を使用して、DriverテーブルのGridプロパティの値にします。しかし、Gridテーブルの更新を取得してDriverテーブルのGridプロパティまで保持できません。Raceテーブルの行を使用してDriverテーブルのRaceプロパティの値にします。

これがデータマッパーのもののコードです。

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で私は次のようなことをします

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!

ご覧のとおり、Gridテーブルで6に設定しても、DriverテーブルのAUS_Qは引き続きnilです。

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

4

1 に答える 1

1

belongs_toリソース間の関連付けを作成するために使用すること、および次のようなIDマップを使用することをお勧めします。

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、IDマップを使用します。したがって、データベース内の同一のオブジェクトは、メモリ内の同一のオブジェクトになります。

于 2012-05-08T12:57:51.740 に答える