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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |