내가 언급 한 특정 사례가 여기에 있습니다. Grid 테이블의 행을 Driver 테이블의 Grid 속성 값으로 사용하려고합니다. 그러나 Grid 테이블의 업데이트를 드라이버 테이블의 Grid 속성에 유지하도록 할 수 없습니다. 드라이버 테이블의 Race 속성 값으로 Race 테이블의 행을 사용하고 싶습니다.Datamapper를 사용하여 한 테이블의 행을 다른 테이블의 한 속성으로 어떻게 사용합니까?
다음은 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!
같은 것을 할 것입니다 - 드라이버 테이블에 AUS_Q 내가 그리드 테이블에 6 일하도록 설정하더라도 전무되고 있습니다.
내가 잘못하고있는 가능성이 있으며 더 쉬운 방법이 있습니다. 나는 모든 수정과 격론을 장려한다.
belongs_to를 사용하면 링크 할 테이블에 후속 n이 필요하지 않습니까? 또한이 연결을 만드는 이점은 무엇입니까? DataMapper.repository 블록이이 관계를 사용하는 방법을 볼 수 없습니다. – JoeyC
필요한 경우에만 'has n'을 다른 테이블에 추가합니다. 연관성을 만드는 이점은 실제 연관성 (실제로 존재하는)을 DM 연관성에 매핑하여 DM을 최대한 활용한다는 것입니다. 이 블록은 데이터베이스의 동일한 객체가 메모리의 동일한 객체에 해당하는지 확인합니다. 즉,'Grid' 객체에서'AUS_Q'를 변경하면 연결된 'Driver' 객체가 변경 사항을 보게됩니다. –
이것은 좋은 대답입니다. 미안 그것은 그것에 오래 돌아가는 데 나를 그렇게 오래 걸렸다! – JoeyC