ruby-on-rails – 设置mongoid哈希字段值

我在一个Rails项目(4.0.x)中使用Mongoid,而且我有一个文档,其中包含一个存储一些无模式数据的哈希字段.
class Thing
  field :name,type: String
  field :mass,type: Integer
  field :info,type: Hash
end

有了这个设置,我可以查询的东西,比如说,有一个关键:endDate像这样:

Thing.where("info.endDate"=>{'$exists'=>true})

这很好,方便.使用一个散列字段为:info字段是很好的,因为我想要存储没有一个固定的模式和不同从一件事到另一件事.

好的,但是,我不能使用相同的点语法在$set键/值对中的:info哈希. [1]

thing.set("info.endDate"=>Time.Now)

引发Mongoid :: Errors :: UnkNownAttribute错误.

它告诉我,我必须在我的模型中包含Mongoid :: Attributes :: Dynamic,但这对我来说似乎不对. The point of the hash field type似乎是允许您处理没有固定模式的数据.似乎我不应该包含一个特殊的“动态属性”模块来使用哈希字段.

所以现在,我正在使用常规旧的[]语法来更新值,然后在模型上调用save,就像这样:

thing.info[:endDate] = Time.Now
thing.save

但是很多时候发生这样的事情,只要设定价值就会更好一些.是否有其他语法设置哈希字段值?我错了以上的错误信息和动态属性错误的?我现在卡住了两步更新哈希字段吗?

[1]诚然,我最近从mongomapper迁移,所以我对这种语法的期望部分是通过以前在mongomapper中做到的.

解决方法

哈希字段的东西是,它可以是你想要的动态.因此,为防止由于代码中的错误而导致的意外字段污染您的DB模式,认情况下禁用此功能.

不,你没有停止使用2步更新为您的散列!

[],[] =是read_attribute()和write_attribute()的快捷方式,如果不包括Mongoid :: Attributes :: Dynamic,则应该使用它们.如果您尝试使用$set而不启用动态属性,则会收到无方法错误,因为它不会将动态属性看作定义的属性.

如果您将阅读Mongoid::Attributes::Dynamic的来源,那么您会发现添加动态属性功能是必需的.

要通过包含Mongoid :: Attributes :: Dynamic来更新值,您需要按照以下步骤操作:

thing = Thing.first
thing.set("info.endDate" => Time.Now)
thing.reload # This will update the current variable

否则,如果您需要,您可以轻松地跳过此操作,并通过两步法进行更新

我希望这对您的查询有所了解.

资源:

Rails mongoid dynamic fields – no method error

Dynamic attributes with Rails and Mongoid

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...