2010-06-29 3 views
0

Lors de l'ajout d'une clé à un modèle existant (avec des données existantes) via MongoMapper, je peux créer de nouveaux documents avec la nouvelle clé mais en essayant d'accéder aux documents existants que c'est une "méthode indéfinie".MongoMapper - Mise à jour des enregistrements existants avec de nouvelles clés

Je me demandais si quelqu'un avait un aperçu.

Merci d'avance!

- model.rb - 

key :key_1 
key :key_2 

- would return - 
#<Model _id: BSON::ObjectID('4ba821abebddb9094c000001'), key_1: "test", key_2: "test"> 


- model.rb (updated version) - 

key :key_1 
key :key_2 
key :key_3 

- would still only return - 
#<Model _id: BSON::ObjectID('4ba821abebddb9094c000001'), key_1: "test", key_2: "test"> 

- but if a new doc is created - 
#<Model _id: BSON::ObjectID('4ba821abebddb9094c000001'), key_1: "test", key_2: "test"> 
#<Model _id: BSON::ObjectID('7ba131abedaab9094c007482'), key_1: "test", key_2: "test", key_3: "test"> 

Ce serait être bien à l'exception du fait que je reçois une méthode erreur non définie lors d'une tentative d'accès (Oui, ces exemples sont tronqués.): Pour le premier Commutateur 3 document.

Rails

2.3.4

mongomapper 0.7.4

+0

Tom, pouvez-vous poster un extrait de code parce que je ne vois pas ce comportement ici. Oh et quelles versions de MongoDB et MongoMapper exécutez-vous? – Joc

+0

Je viens de le mettre à jour. – Tom

Répondre

0

Je ne vois pas ce comportement du tout, même lors de l'interaction avec un objet instancié avant que je mis à jour la classe. Lorsque vous exécutez ce qui suit dans RIR, je n'ai pas d'erreurs:

>> gem 'mongo_mapper', '0.7.4' 
=> true 
>> require 'mongo_mapper' 
=> true 
>> MongoMapper.database = 'test' 
=> "test" 
>> class Foo 
>> include MongoMapper::Document 
>> key :something 
>> end 
=> #<MongoMapper::Plugins::Keys::Key:0x101f8f938 @default_value=nil, @type=nil, @name="something", @options={}> 
>> f = Foo.new(:something => 'thing') 
=> #<Foo _id: ObjectID('4c4dc9af712337447c000001'), something: "thing"> 
>> f.save 
=> true 
>> f 
=> #<Foo _id: ObjectID('4c4dc9af712337447c000001'), something: "thing"> 
>> class Foo 
>> key :something_else 
>> end 
=> #<MongoMapper::Plugins::Keys::Key:0x101f6ad90 @default_value=nil, @type=nil, @name="something_else", @options={}> 
>> f 
=> #<Foo something_else: nil, _id: ObjectID('4c4dc9af712337447c000001'), something: "thing"> 
>> f.something_else 
=> nil 

Comme il semble que vous rencontrez un problème inhabituel, plus de détails sur votre cas d'utilisation serait utile. Pourriez-vous s'il vous plaît nous donner un exemple de code plus complet? Si le code est défectueux, réduisez-le au minimum nécessaire pour qu'il échoue encore et publiez les déclarations complètes de vos modèles et du code que vous utilisez pour y accéder.

0

Utilisez la commande set ...

@model.set(:key_3 => "VALUE...") 
    @model.reload 
    @model.key_3 # => "VALUE..." 
    @model.save 

Ce code va créer un nouveau champ pour votre modèle, vérifiez que vous avez déjà fait défini avec la nouvelle clé:

key :key_3 

Profitez,

Questions connexes