我所指的具体实例就在这里。我想使用Grid表中的一行作为Driver表中Grid属性的值。但我无法在Grid表中获取更新以持久保存到Driver表上的Grid属性 我想使用Race表中的一行作为Driver表中Race属性的值。
以下是datamapper内容的代码。
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!
如您所见 - 即使我在网格表中将其设置为6,Driver表中的AUS_Q仍为零。
我有可能做错了,有一种更简单的方法可以做到这一点。我鼓励所有纠正和打击。
答案 0 :(得分: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
发起的阻止中执行的所有操作都将使用身份地图。因此,数据库中的相同对象将在内存中产生相同的对象。