发布
社区首页 >问答首页 >mongoid update_attributes更改数据类型

mongoid update_attributes更改数据类型
EN

Stack Overflow用户
提问于 2011-03-02 01:12:07
回答 3查看 581关注 0票数 4

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

问题来了,我的mongo文档有一个'node‘,它是一堆键值对,根据记录的不同而变化。当我像这样加载记录时:

代码语言:javascript
代码运行次数:0
复制
MongoObject.find(BSON::ObjectId('ABC1234567890'))
 => #<MongoObject _id: ABC1234567890,  node: {"totallogins"=>11, "id"=>"logIns"}>

我使用一个标准的rails表单来更新值,这样post数据看起来就像这样:

代码语言:javascript
代码运行次数:0
复制
{"commit"=>"Edit", "utf8"=>"✓", "id"=>"ABC1234567890", "mongo_object"=>{"node"=>{"totallogins"=>"12", "id"=>"logIns"}}

如果我这样做了:

代码语言:javascript
代码运行次数:0
复制
@mongo_object.update_attributes(params[:mongo_object])

这是可行的,但会将"totallogins“的数据类型从int更改为string,因为post数据是string。

现在active record自己处理这个问题,但我需要一个能与mongoid一起工作的解决方案。

你知道我该怎么做吗?

EN

回答 3

Stack Overflow用户

发布于 2011-03-02 20:29:52

谢谢。不幸的是,我不能,因为node的字段是完全动态的,所以我不能定义它们。我想出了下面的解决方案,但它有点丑陋:

代码语言:javascript
代码运行次数:0
复制
@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
票数 2
EN

Stack Overflow用户

发布于 2011-03-02 03:03:49

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

代码语言:javascript
代码运行次数:0
复制
class Node
  include Mongoid::Document
  embedded_in :mongo_object

  field :totallogins, type: Integer

  ...
end
票数 0
EN

Stack Overflow用户

发布于 2011-04-02 13:52:27

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5157844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档