2009-03-27 17 views
0

Ceci concerne la bibliothèque ORM ruby ​​DataMapper.Comment obtenir l'adaptateur in_memory de la bibliothèque ruby ​​DataMapper pour enregistrer correctement l'identifiant du modèle?

This wiki décrit comment utiliser l'adaptateur in_memory pour DataMapper. Les adaptateurs de base de données correct permet de réaliser un incrémenter, identifiant unique sur chaque instance de modèle - in_memory ne semble pas faire comme le montre l'extrait suivant:

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 

Les résultats de l'inspection est la suivante:

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

Si j'avais utilisé un autre adaptateur pour me connecter, par exemple, une base de données sqlite id aurait été définie sur '1'.

Je voudrais me référer à mes modèles via id, car je ne peux pas garantir l'unicité sur d'autres attributs. Existe-t-il un moyen de faire en sorte que l'adaptateur in_memory enregistre un attribut d'identifiant unique incrémentiel pour ses modèles?

Répondre

0

Pour autant que je peux dire, auto-incrémentée est pas pris en charge pour l'adaptateur en mémoire DM (je soupçonne que l'adaptateur ne soit pas beaucoup d'amour) mais vous pouvez truquer assez facilement:

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 

Je ne pense pas que je recommanderais cependant. Une alternative probablement préférable serait d'utiliser une base de données SQLite en mémoire à la place.

3

Vous ne savez pas exactement quel était votre problème, mais ce problème est désormais résolu: votre exemple de script fonctionne avec DataMapper 1.0.2. En outre, la syntaxe correcte est maintenant:

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 

Contrairement à la réponse de Bob, l'adaptateur en mémoire est un citoyen de première classe qui est tenue à jour et documenté, car il est largement utilisé dans la suite de tests, et également fourni comme exemple de base pour les nouveaux adaptateurs.