0

これは、rubyORMライブラリDataMapperに関するものです。

このウィキでは、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属性を保存させる方法はありますか?

4

2 に答える 2

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

Bob の回答とは対照的に、インメモリ アダプターは、テスト スイートで広く使用され、新しいアダプターのサンプル ベースとしても提供されるため、最新の状態に保たれ、文書化されているファースト クラスの市民です。

于 2011-02-26T04:28:52.693 に答える
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 インメモリ データベースを使用する方が、おそらくはるかに優れた代替手段の 1 つです。

于 2009-06-01T20:06:03.517 に答える