Как получить адаптер in_memory из библиотеки ruby ​​DataMapper для правильного сохранения идентификатора модели? - PullRequest
0 голосов
/ 27 марта 2009

Это относится к библиотеке Ruby ORM DataMapper .

В этой вики описано, как использовать адаптер in_memory для DataMapper. Правильные адаптеры базы данных сохраняют увеличивающийся уникальный идентификатор на каждом экземпляре модели - 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'.

Я хотел бы сослаться на свои модели через идентификатор, потому что я не могу гарантировать уникальность других атрибутиков. Есть ли способ заставить адаптер in_memory сохранить добавочный уникальный идентификатор id для своих моделей?

Ответы [ 2 ]

3 голосов
/ 26 февраля 2011

Не уверен, какая именно у вас проблема, но эта проблема теперь исправлена ​​- ваш пример сценария работает с 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

Вопреки ответу Боба, адаптер в памяти является гражданином первого класса, который постоянно обновляется и документируется, поскольку он широко используется в тестовом наборе, а также предоставляется в качестве примера базы для новых адаптеров. *

0 голосов
/ 02 июня 2009

Насколько я могу судить, автоинкремент не поддерживается для адаптера в памяти 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 в памяти.

...