【问题标题】:Using mongomapper and rails my record refuses to update使用 mongomapper 和 rails 我的记录拒绝更新
【发布时间】:2012-10-03 07:23:15
【问题描述】:

我的数据库不会更新我的 active_quests。我要做的就是用另一个更新的哈希数组替换一个哈希数组。我认为这将是处理此问题的最简单方法。代码如下:

# construct the query
query = Player.where( :_id => player_id).fields( :xp, :lvl_prgrssns, :active_quests, :completed_quests )

# get the player
player = query.first

if !player.nil?
    return_val = player.set( :active_quests => [{"quest_id" => "123"}, {"quest_id" => "456"}])
    logger.debug "return_val = "+return_val.to_s # comes out as 180
end

我的理解是,如果从一组中返回是正数,这意味着该组是成功的。在这种简化的情况下,它返回 180,但 active_quests 永远不会在播放器上更新。我可以进入 mongo 控制台并执行此操作:

db.players.update({_id:ObjectId("50756b1896f4f5121a00000a")}, {$set:{active_quests:[{"quest_id":"1"}, {"quest_id":"2"}] }});

并且 active_quests 将按预期更新,但无论我在 rails 中尝试什么,更新似乎都会通过,但没有任何更新。

以下是我尝试过的众多替代方案中的一些(所有都尝试过使用和不使用 .to_mongo 以及在它们之后使用和不使用 player.save):

Player.where( :_id => params[:player_id] ).update(:active_quests => active_quests_list.to_mongo)

player.update_attributes(:active_quests => active_quests_list.to_mongo)

player_update = player.as_json
player_update["active_quests"] = active_quests_list
player.update_attributes(player_update)

return_val = query.update( "$set" => {:active_quests => player.active_quests.to_mongo} )

return_val = query.update( {:_id => params[:player_id]}, {"$set" => {:active_quests => active_quests_list.to_mongo}})

我希望这里有人知道我做错了什么。

【问题讨论】:

    标签: ruby-on-rails ruby mongodb mongomapper


    【解决方案1】:

    经过进一步调查,事实证明这是一个与播放器变量如何在函数之外更新有关的问题。

    在这种情况下,以下几行将更新记录(内存中和数据库中)

    player[:active_quests] << @active_quests_list
    player.push_all(:active_quests => player.active_quests)
    

    但是,在这种情况下,播放器变量是此函数的本地变量,并且在函数返回后再次更新。

    这是在仔细检查“mongod -vvvvv”的输出后才发现的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多