【问题标题】:Mongo Mapper Won't Destroy Document During LoopMongo Mapper 不会在循环期间破坏文档
【发布时间】:2016-02-05 06:55:51
【问题描述】:

这一定是一个简单的答案,但我很困惑。我正在使用 Mongo Mapper 运行 Sinatra 应用程序,并尝试销毁与 rem_users 数组中的用户 ID 关联的少数文档。以下循环为 rem_users 的每个元素查找关联的 GroupMember,并尝试将其删除。当我运行它时,GroupMember 没有被破坏。

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 模型上没有任何类型的验证。谢谢!

【问题讨论】:

    标签: ruby mongodb sinatra mongomapper


    【解决方案1】:

    想通了:

    所以 Group 被加载到块的顶部:

    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 。循环做的一切都是正确的,但是在保存已经加载的 Group 时,我重新保存了所有被破坏的 GroupMembers。

    我所要做的就是在删除用户之前保存组,然后销毁按预期进行。

    【讨论】:

    • 您可以使用GroupMember.destroy_all(:dealer_user_id.in => rem_users, :group_id => g.id) 简化此操作,以便一次性完成所有操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 2012-05-26
    • 1970-01-01
    相关资源
    最近更新 更多