2015-11-04 119 views
0

這必須是一個簡單的答案,但我很困惑。我正在使用Mongo Mapper運行Sinatra應用程序,並試圖銷燬與rem_users數組中的用戶ID相關的一些文檔。以下循環爲rem_users的每個元素查找關聯的GroupMember,並嘗試刪除它。當我運行它時,GroupMember不會被銷燬。Mongo Mapper在循環期間不會破壞文檔

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

rem_users是已轉換爲字符串的BSON ID的數組。我已驗證查詢正在使用此查詢提取正確的GroupMember,並且如果我在該示例中放置了一個binding.pry,並且複製粘貼了該循環的下一行,則GroupMember被成功銷燬。我試過了:

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

和結果是一樣的。 GroupMember模型上沒有任何類型的驗證。謝謝!

回答

0

想通了:

所以集團在裝載塊的頂部:

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 

然後後保存的破壞已經發生。所以看起來,當g被加載時,它會隨着它加載g.members。循環正確地做了一切,但在保存已經加載的組時,我重新保存了所有被破壞的組成員。

我所要做的就是在刪除用戶之前保存該組,然後銷燬按預期工作。

+0

您可以使用'GroupMember.destroy_all(:dealer_user_id.in => rem_users,:group_id => g.id)'來簡化此操作,以便一次性完成所有操作。 –