2009-03-27 3 views
0

이것은 루비 ORM 라이브러리 DataMapper에 관한 것입니다.모델의 ID를 올바르게 저장하기 위해 루비 라이브러리 DataMapper의 in_memory 어댑터를 만들려면 어떻게해야합니까?

This wiki은 DataMapper에 in_memory 어댑터를 사용하는 방법을 설명합니다. 적절한 데이터베이스 어댑터는 각 모델 인스턴스에 증분, 고유 ID를 저장 - 다음 코드와 같이 in_memory 그렇게하지 않는 것 다음 검사의

require 'rubygems' 
require 'dm-core' 

DataMapper.setup(:in_memory, :adapter => 'in_memory') 

class Foo 
    include DataMapper::Resource 

    def self.default_repository_name;:in_memory;end 
    def self.auto_migrate_down!(rep);end 
    def self.auto_migrate_up!(rep);end 
    def self.auto_upgrade!(rep);end 

    property :id, Serial 
    property :name, Text 
end 

f = Foo.new 
f.name = "foo" 
f.save 

puts f.inspect 

결과입니다 :

#<Foo id=nil name="foo"> 

예를 들어, 다른 어댑터를 사용하여 sqlite 데이터베이스 에 연결하면 '1'로 설정됩니다.

id를 통해 내 모델을 참조하고 싶습니다. 다른 속성 세트의 고유성을 보장 할 수 없기 때문입니다. in_memory 어댑터가 모델에 대해 증가하고 고유 한 id 속성을 저장하는 방법이 있습니까?

답변

0

지금까지 내가, 자동 증가가 DM 메모리 어댑터 (I 어댑터가 많은 사랑을하지 않는 것을 의심)이 지원되지 않습니다 말할 수 있지만, 당신 수 아주 쉽게 가짜 :

before :save, :increment_id 
def increment_id 
    self.id ||= begin 
    last_foo = (Foo.all.sort_by { |r| r.id }).last 
    (last_foo ? last_foo.id : 0).succ 
    end 
end 

나는 이것이 비록 내가 권하고 싶지 않다고 생각한다. SQLite in-memory 데이터베이스를 대신 사용하는 것이 훨씬 좋은 대안입니다.

3

정확히 무슨 문제인지는 모르지만이 문제는 이제 해결되었습니다. 예제 스크립트는 DataMapper 1.0.2에서 작동합니다. 이 테스트 스위트에서 광범위하게 사용되기 때문에

require 'dm-core' 

DataMapper.setup(:default, :adapter => 'in_memory') 

class Foo 
    include DataMapper::Resource 

    property :id, Serial 
    property :name, Text 
end 

f = Foo.new 
f.name = "foo" 
f.save 

puts f.inspect 

밥의 대답과는 달리이의 인 - 메모리 어댑터가 최신 상태로 유지하고 문서화하는 최고 수준의 시민이며, : 또한, 올바른 구문은 지금 새 어댑터의 예제 기반으로도 제공됩니다.