2009-03-27 1 views
0

これはルビーORMライブラリDataMapperに関連しています。モデルのIDを正しく保存するために、Rubyライブラリ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データベースに接続するために別のアダプタを使用した場合idは '1'に設定されていました。

他のアトリビュートとの一意性を保証できないため、私のモデルをidで参照したいと思います。 in_memoryアダプタをモデルのインクリメントして一意のid属性を保存する方法はありますか?

答えて

0

私の知る限り、自動インクリメントがDM、インメモリアダプタはサポートされていません(私はアダプタが多くの愛を得ないと思われる)が、あなたは可能性が偽かなり簡単:

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 

それはテストスイートで広く使用されているので、メモリ内のアダプタは、最新の状態に保たれ、文書化された第一級オブジェクトであり、新しいアダプタのベースとしても提供されています。

関連する問題