1

私のデータベースは私の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は期待どおりに更新されますが、レールで何を試しても、更新は完了したように見えますが、何も更新されません。

これが私が試した多くの選択肢のいくつかです(すべてが.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}})

ここの誰かが私が間違っていることを知っているかもしれないことを願っています。

4

1 に答える 1

0

さらに調査したところ、これは関数の外部でプレーヤー変数がどのように更新されていたかに関する問題であることが判明しました。

この場合、次の行でレコードが更新されます(メモリ内とデータベース内の両方)

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

ただし、この場合、プレーヤー変数はこの関数に対してローカルであり、関数が戻った後に再度更新されていました。

これは、「mongod-vvvvv」の出力を注意深く調べた後にのみ発見されました。

于 2012-10-15T19:24:53.400 に答える