2012-05-08 5 views
0

내가 언급 한 특정 사례가 여기에 있습니다. 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 일하도록 설정하더라도 전무되고 있습니다.

내가 잘못하고있는 가능성이 있으며 더 쉬운 방법이 있습니다. 나는 모든 수정과 격론을 장려한다.

답변

1

난 당신이 자원 사이의 연결을 만들 수 belongs_to를 사용하는 것이 좋습니다, 당신은이 같은 정체성지도, 사용하는 것입니다 : 당신이 신원 맵을 사용합니다 DataMapper.repository(:default) do에 의해 시작 블록 내에서 할

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 

다. 따라서 데이터베이스의 동일한 개체는 동일한 개체를 메모리에 저장합니다.

+0

belongs_to를 사용하면 링크 할 테이블에 후속 n이 필요하지 않습니까? 또한이 연결을 만드는 이점은 무엇입니까? DataMapper.repository 블록이이 관계를 사용하는 방법을 볼 수 없습니다. – JoeyC

+1

필요한 경우에만 'has n'을 다른 테이블에 추가합니다. 연관성을 만드는 이점은 실제 연관성 (실제로 존재하는)을 DM 연관성에 매핑하여 DM을 최대한 활용한다는 것입니다. 이 블록은 데이터베이스의 동일한 객체가 메모리의 동일한 객체에 해당하는지 확인합니다. 즉,'Grid' 객체에서'AUS_Q'를 변경하면 연결된 'Driver' 객체가 변경 사항을 보게됩니다. –

+0

이것은 좋은 대답입니다. 미안 그것은 그것에 오래 돌아가는 데 나를 그렇게 오래 걸렸다! – JoeyC

관련 문제