2011-03-01 63 views
4

我创建一个简单的rails应用程序来修改现有的mongo数据库中的数据。我使用mongoid进行交互,并且可以很好地读取/销毁对象。mongoid update_attributes改变数据类型

问题出现的是我的mongo文档有一个'节点',它是一串键值对,因记录而异。我使用的是标准轨

MongoObject.find(BSON::ObjectId('ABC1234567890')) 
=> #<MongoObject _id: ABC1234567890, node: {"totallogins"=>11, "id"=>"logIns"}> 

形成这样才能使后期数据的模样来更新值:当我加载像这样的记录

{"commit"=>"Edit", "utf8"=>"✓", "id"=>"ABC1234567890", "mongo_object"=>{"node"=>{"totallogins"=>"12", "id"=>"logIns"}} 

如果我再做:

@mongo_object.update_attributes(params[:mongo_object]) 

这可以工作,但会将“totallogins”的数据类型从int更改为字符串,因为发布数据是字符串。

现在积极的记录处理这个本身,但我需要一个解决方案,将与mongoid一起工作。

任何想法我可以做到这一点?

回答

0

如果将节点设置为embedded_document,则可以在声明它们时明确设置字段类型。

class Node 
    include Mongoid::Document 
    embedded_in :mongo_object 

    field :totallogins, type: Integer 

    ... 
end 
2

谢谢。不幸的是我不能像节点的字段是完全动态的,所以我不能定义它们。我已经想出了以下解决方案,但它的一点点丑陋:

@mongo_object.node.each do |k,v| 
    new_value = params[:mongo_object][:node][k.to_sym] 
    new_value = new_value.to_i if v.class == Fixnum 

    @mongo_object.node[k] = new_value 
end 

@mongo_object.save