2012-10-12 63 views
1

我的數據庫不會更新我的active_quests。我所要做的就是用另一個更新的哈希數組替換一個哈希數組。我認爲這是處理這個問題的最簡單方法。這裏的代碼:使用mongomapper和rails我的記錄拒絕更新

# 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永遠不會在玩家身上得到更新。我可以進入控制檯蒙哥並執行此:如預期

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

和active_quests將更新,但無論怎樣我嘗試在軌更新出現,但沒有更新的經歷。

下面是一些很多替代我已經試過(全部都試過了有和沒有.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}}) 

我在這裏希望有人可能知道我做錯了什麼。

回答

0

經過進一步調查後,事實證明,這是一個問題,有關如何更新播放器變量的功能之外。

下面的線將更新在這種情況下,記錄(無論是在內存中,並在數據庫中)

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

然而,播放器變量是當地在此情況下,該功能,並再次更新函數返回後。

這是在仔細檢查「mongod -vvvvv」的輸出後才發現的。