【问题标题】:mongoid update_attributes changing datatypesmongoid update_attributes 改变数据类型
【发布时间】:2011-07-06 16:23:32
【问题描述】:

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

问题来了,我的 mongo 文档有一个“节点”,它是一堆键值对,取决于记录。当我像这样加载记录时:

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 更改为字符串,因为发布数据是字符串。

现在活动记录本身可以解决这个问题,但我需要一个可以与 mongoid 一起使用的解决方案。

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

【问题讨论】:

    标签: ruby-on-rails mongodb mongoid


    【解决方案1】:

    谢谢。不幸的是,我不能,因为节点的字段是完全动态的,所以我无法定义它们。我想出了以下解决方案,但它有点难看:

    @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】:

      如果您将节点设为嵌入式文档,那么您可以在声明它们时显式设置字段类型。

      class Node
        include Mongoid::Document
        embedded_in :mongo_object
      
        field :totallogins, type: Integer
      
        ...
      end
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2012-11-03
          • 1970-01-01
          • 2014-02-26
          • 1970-01-01
          • 2013-01-26
          • 1970-01-01
          • 2011-09-17
          • 1970-01-01
          • 2014-08-18
          相关资源
          最近更新 更多