mongoid update_attributes更改数据类型

时间:2011-03-01 17:12:07

标签: ruby-on-rails mongodb mongoid

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

问题来自于我的mongo文档有一个'node',它是一堆键值对,具体取决于记录。当我像这样加载记录时:

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

我正在使用标准的rails表单来更新值,因此帖子数据如下所示:

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

如果我这样做:

@mongo_object.update_attributes(params[:mongo_object])

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

现在活跃的记录处理这个本身但我需要一个可以与mongoid一起使用的解决方案。

我有什么想法可以做到这一点?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

class Node
  include Mongoid::Document
  embedded_in :mongo_object

  field :totallogins, type: Integer

  ...
end

答案 2 :(得分:0)

http://mongoid.org/docs/documents/提到了如何处理类型;也许确保你的类型是整数?