0

这与 ruby​​ ORM 库DataMapper 相关

这个 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 属性?

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 内存数据库。

于 2009-06-01T20:06:03.517 回答