2015-11-04 3 views
0

Cela doit être une réponse simple, mais je suis perplexe. J'utilise une application Sinatra avec Mongo Mapper et je tente de détruire une poignée de documents associés aux identifiants d'utilisateur dans le tableau rem_users. La boucle suivante recherche le GroupMember associé pour chaque élément de rem_users et tente de le supprimer. Quand je l'exécute, le GroupMember n'est pas détruit.Mongo Mapper ne détruira pas le document pendant la boucle

rem_users.each do |du_id| 
    ### 
    GroupMember.first('$and' => [{dealer_user_id: du_id}, {group_id: g.id}]).destroy 
end 

rem_users est un tableau de ids BSON qui ont été converties en chaînes. J'ai vérifié que la requête tire le GroupMember correct avec cette requête, et si je mets un binding.pry où le ### est dans l'exemple et copiez-collez la ligne suivante exacte de la boucle, le GroupMember est détruit avec succès . J'ai essayé:

remgm = GroupMember.all('$and' => [{group_id: g.id}, {dealer_user_id: rem_users}]) 
remgm.each {|gm| GroupMember.destroy(gm.id)} 

et le résultat est le même. Il n'y a aucune validation d'aucune sorte sur le modèle GroupMember. Merci!

Répondre

0

figured it out:

Ainsi, le Groupe a été chargé en haut du bloc:

g = Group.find(params[:group_id]) 
redirect '/' unless g 

... 

rem_users.each do |du_id| 
    ### 
    GroupMember.first('$and' => [{dealer_user_id: du_id}, {group_id: g.id}] ).destroy 
end 

g.save 

Et puis sauvé après la destruction était arrivé. Il semble donc que lorsque g a été chargé, il a chargé g.members avec lui. La boucle faisait tout correctement, mais lors de l'enregistrement du groupe déjà chargé, j'ai réenregistré tous les membres du groupe détruits.

Tout ce que je devais faire était de sauvegarder le groupe avant de supprimer des utilisateurs, et la destruction a fonctionné comme prévu.

+0

Vous pouvez simplifier cela avec 'GroupMember.destroy_all (: dealer_user_id.in => rem_users,: group_id => g.id)' pour les obtenir tous en un seul coup. –