我在Rails项目中使用Mongoid(均为4.0.x),并且我有一个带有哈希字段的文档,该字段存储一些无模式数据.
class Thing
field :name, type: String
field :mass, type: Integer
field :info, type: Hash
end
Run Code Online (Sandbox Code Playgroud)
通过这种设置,我可以查询具有如下关键字的内容:endDate:
Thing.where("info.endDate"=>{'$exists'=>true})
Run Code Online (Sandbox Code Playgroud)
这一切都很好用.对这个:info字段使用哈希字段是很好的,因为我想要存储的东西没有固定的模式,并且从一个东西到另一个东西各不相同.
好吧,但是,我不能$set对:info哈希中的键/值对使用相同的点语法.[1]
thing.set("info.endDate"=>Time.now)
Run Code Online (Sandbox Code Playgroud)
引发Mongoid::Errors::UnknownAttribute错误.
它告诉我,我必须Mongoid::Attributes::Dynamic在我的模型中包含这样做,但这对我来说似乎不对.哈希字段类型的要点似乎是允许您处理没有固定模式的数据.我似乎不应该包含一个特殊的"动态属性"模块来使用哈希字段.
所以现在,我正在使用常规的旧[]语法更新值,然后调用save模型,如下所示:
thing.info[:endDate] = Time.now
thing.save
Run Code Online (Sandbox Code Playgroud)
但是很多时候它会发生这样$set的价值更好.是否有其他语法来设置哈希字段值?我错误的上述错误消息和动态属性是错误的?我暂时不想对哈希字段进行两步更新吗?
[1]不可否认,我最近从mongomapper迁移过来,所以我对这种语法的期望部分是由于能够在mongomapper中做到这一点.
我已经阅读了文档,我找不到具体的方法来解决这个问题.我已经为模型添加了一些动态属性,我希望能够遍历所有这些属性.
所以,举一个具体的例子:
class Order
include Mongoid::Document
field :status, type: String, default: "pending"
end
Run Code Online (Sandbox Code Playgroud)
然后我做以下事情:
Order.new(status: "processed", internal_id: "1111")
Run Code Online (Sandbox Code Playgroud)
后来我想回来并且能够获得所有动态属性的列表/数组(在这种情况下,"internal_id"就是它).
我还在挖,但我很想知道是否有其他人已经解决了这个问题.