微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/ruby/272881.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐