我已经使用mongomapper几个星期了,喜欢它的很多特性。其中最吸引人的是定义自定义键类型和验证方法的能力(请参见本页的“自定义类型”:http://mongomapper.com/documentation/types.html)。
不过,我试着在一个小测试中使用它们,在我的案例中验证方法并没有启动。代码如下:

require 'mongo_mapper'

MongoMapper.connection = Mongo::Connection.new('localhost', 27017)
MongoMapper.database = "mmtestdb"

class ACustomType
    def self.to_mongo(value)
        puts "to_mongo is being called"
        "A Safe Value"
    end
    def self.from_mongo(value)
        puts "from_mongo is being called"
        "A Safer Value"
    end
end

class TestClass
    include MongoMapper::Document

    key :my_name, type: ACustomType
end

TestClass.delete_all
new_object = TestClass.new
new_object.my_name = "Unsafe Value!"
puts new_object.inspect
new_object.save
puts TestClass.all.inspect

以下是我的研究结果:
#<TestClass _id: BSON::ObjectId('525db435ab48651f64000001'), my_name: "Unsafe Value!">
[DEPRECATED] The 'safe' write concern option has been deprecated in favor of 'w'.
[#<TestClass _id: BSON::ObjectId('525db435ab48651f64000001'), my_name: "Unsafe Value!">]

我知道“write concern”问题,并使用https://github.com/mongomapper/mongomapper/issues/507上的解决方案进行了修补。这是密码:
# Monkey Patch to solve issue https://github.com/jnunemaker/mongomapper/issues/507
module MongoMapper
  module Plugins
    module Querying
      private
        def save_to_collection(options={})
          @_new = false
          collection.save(to_mongo, :w => options[:safe] ? 1 : 0)
        end
    end
  end
end

我从我的测试示例中省略了它,因为不管有没有它,结果都是一样的。
有人能帮忙吗?非常感谢。

最佳答案

您只需将密钥定义为:

 key :my_name, ACustomType

而不是:
 key :my_name, type: ACustomType

key的方法签名是def key(name, type, options = {})

关于ruby - MongoMapper自定义类型不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19391639/

10-09 22:29