2010-11-16 23 views
0

Voici mes modèles:Mongoid many-to-many, est-ce normal?

class User 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    references_many :roles, :stored_as => :array, :inverse_of => :users 
    ... 
end 

class Role 
    include Mongoid::Document 

    field :name, :type => String 

    references_many :users, :stored_as => :array, :inverse_of => :roles 
    ... 
end 

J'ai d'abord créer les rôles par graines, rake db: graines. Mon fichier de départ contient:

puts '*** Add default roles' 
[ 
    { :name => 'User' }, 
    { :name => 'Artist' } 
].each do |h| 
    Role.create(h) 
end 

Les rôles sont créés avec succès. Cependant, quand j'ajouter un rôle à un utilisateur, je fais:

foobar = User.first 
foobar.roles.create(:name => 'User') 

Je remarque 2 choses:

1) Il ajoute le rôle de référence dans la collection de l'utilisateur.

2) Il crée un 3ème rôle dans la collection Role.

C'est un peu étrange car j'ai maintenant 3 rôles: Utilisateur, Artiste et Utilisateur. La deuxième collection User a une référence user_ids qui contient l'identifiant de foobar.

Est-ce normal?

Répondre

1

Je pense que vous voulez plutôt faire:

foobar = User.first 
foobar.roles << Role.find(:name => 'User') 
foobar.save 

De cette façon, un objet de rôle n'est pas créé, mais une référence est ajouté à un dossier déjà existant.

+0

Oui, il semble que ce soit fait correctement. Par chance, savez-vous comment supprimer la référence après l'avoir ajoutée avec "<<"? –

+0

@ Christian Eh bien, c'est un bon. Je ne suis pas un utilisateur expérimenté de Mongoid, mais j'essaierais 'foobar.roles.find (: name => 'User'). Destroy'. À mon avis, cela déconnecte les deux entités, et ne détruit pas le rôle complet. Mais certainement le tester longtemps avant la production. :) – pestaa

+0

Hmmm. Juste essayé .destroy et apparemment il supprime le rôle complet dans la collection de rôles. Merci pour la tentative si :-) –