mongoid update_attributes изменение типов данных - PullRequest
4 голосов
/ 01 марта 2011

Я создаю простое приложение rails для изменения данных в существующей базе данных Монго.Я использую mongoid для взаимодействия и могу нормально читать / уничтожать объекты.

Проблема возникает в том, что в моем документе 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.

Есть идеи, как я могу это сделать?

Ответы [ 3 ]

2 голосов
/ 02 марта 2011

Спасибо.К сожалению, я не могу, поскольку поля для узла являются полностью динамическими, поэтому я не могу их определить.Я пришел к следующему решению, но оно немного уродливо:

@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
0 голосов
/ 02 апреля 2011

http://mongoid.org/docs/documents/ упоминает, как обращаться с типами; возможно, убедитесь, что ваш тип является целым числом?

0 голосов
/ 01 марта 2011

Если вы сделаете узел встраиваемым_документом, тогда вы можете явно указать типы полей при их объявлении.

class Node
  include Mongoid::Document
  embedded_in :mongo_object

  field :totallogins, type: Integer

  ...
end
...