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中做到的.
解决方法
不,你没有停止使用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
否则,如果您需要,您可以轻松地跳过此操作,并通过两步法进行更新
我希望这对您的查询有所了解.
资源: