0

如果您为 Mongo 提供使用符号作为键的哈希并保存文档,它将“字符串化”它,这意味着键将被转换为字符串。总结一下:

条件:哈希键将是:
---------- ------------------
初始化文档符号或字符串后
保存文档字符串后
获取文档字符串后

这种“不对称”导致我的测试有些丑陋。我希望能够“依赖”始终是字符串的键 - 而不必担心文档是否刚刚初始化。

避免这种情况的一种或多种优雅方法是什么?

注意:就我而言,我使用的是 Mongoid,但我认为这个问题不一定是 Mongoid 特定的。它可能适用于任何使用 MongoDB 的 Rails 项目。

4

2 回答 2

1

我目前的解决方案是覆盖每个字段设置器来调用stringify_keys!. 例如:

def field_name=(x)
  x.stringify_keys! if x
  super(x)
end

这是迄今为止我发现的最好的。我考虑了其他选择:

  • 使用before_validation回调。但是,我不喜欢这种方法。我不喜欢valid?为了触发字符串化而不得不打电话。

  • 使用after_initialize. 但是,这并不能处理初始化后调用 setter 的情况。

于 2012-06-25T20:01:54.493 回答
1

沿着这些路线的东西可能会起作用。基本上这段代码重新定义了 Mongoid 的field宏(它的 setter)。

require 'mongoid'

module Stringifier
  def field name, args = {}
    super # call mongoid implementation

    define_method "#{name}=" do |val|
      val.stringify_keys! if val && val.respond_to?(:stringify_keys!)
      super(val)
    end
  end
end

class Foo
  include Mongoid::Document
  extend Stringifier

  field :subhash, type: Hash
end

f = Foo.new
f.subhash = {a: 1, b: 2}

puts f.subhash
# >> {"a"=>1, "b"=>2}

这可能不是最干净的实现,但你明白了。

于 2012-06-25T20:23:00.403 回答