Используя mongomapper и рельсы, моя запись отказывается обновляться

Моя база данных не будет обновлять мои активные_запросы. Все, что я пытаюсь сделать, это заменить один массив хэшей другим, обновленным массивом хэшей. Я предполагал, что это будет самый простой способ справиться с этим. Вот код:

# 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}})

Я надеюсь, что кто-то здесь может знать, что я делаю неправильно.

1 ответ

Решение

После дальнейшего исследования выясняется, что это была проблема, связанная с тем, как переменная проигрывателя обновлялась вне функции.

Следующие строки обновят запись в этом случае (как в памяти, так и в базе данных)

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

Однако в этом случае переменная player была локальной для этой функции и обновлялась снова после возврата из функции.

Это было обнаружено только после тщательного изучения вывода "mongod -vvvvv".

Другие вопросы по тегам