2010-01-07 10 views
3

J'ai un problème avec les associations mongomapper. J'ai un nom de classe utilisateur et un autre modèle nommé. L'utilisateur a de nombreux modèles, mais ...MongoMapper has_many association

user = User.first 
=> <User ... 
user.models 
=> [] 
Model.find_by_user_id(user.id.to_s) 
=> <Model ... 
Model.find_by_user_id(user.id.to_s).user == user 
=> true 

Code de classe (simplifié):

class User 
    include MongoMapper::Document 

    # some keys definition 

    many :models 
end 

class Model 
    include MongoMapper::Document 

    # some keys definitions 

    belongs_to :user 
end 

Qu'est-ce que je fais mal?

Répondre

5

Il semble que MM n'utilise plus String format pour la colonne FK, donc

Model.find_by_user_id(user.id.to_s) 

devrait être

Model.find_by_user_id(user.id) 

En outre, le type de données de la colonne Model.user_id doit être réglé sur

key :user_id, Mongo::ObjectID 

Lorsque j'ai rencontré ce problème, j'ai dû supprimer et recréer ma collection pour l'obtenir pour travailler - en d'autres termes, j'avais l'habitude d'utiliser user_id en tant que String, mais cela ne ferait que "prendre" quand je l'ai changé quand j'ai reconstruit ma base de données. Heureusement, je travaille avec des données de test, ce qui était assez facile.

0

Quels types d'erreurs ou d'exceptions recevez-vous? Le code que vous avez posté semble bien.

+0

Je ne reçois aucune erreur. Just user.models est un tableau vide? J'ai édité ma question, dans la première version j'ai manqué ceci, désolé – Sebastian

0

ah, ceci est mal documenté dans les documents mm. Vous devez faire ici:

class User 
    include MongoMapper::Document 

    # some keys definition 

    many :models, :in => :model_ids 
end 

class Model 
    include MongoMapper::Document 

    # some keys definitions 
    # no belongs_to necessary here 
end 

Vous pouvez ensuite ajouter des modèles à votre utilisateur via:

# use an existing object 
u = User.create ... 
m = Model.create ... 

# and add the model to the user 
u.models << m 

# don't forget to save 
u.save 

# you can then check if it worked like so: 
# u.model_ids => [ BSON::ID 'your user id'] 

Espoir qui a aidé.

Questions connexes