设置mongoid哈希字段值
我在Rails项目中使用Mongoid(均为4.0.x),并且我有一个带有哈希字段的文档,该字段存储了一些无模式数据。
class Thing field :name, type: String field :mass, type: Integer field :info, type: Hash end
通过这种设置,我可以查询具有密钥的东西:endDate
如下所示:
Thing.where("info.endDate"=>{'$exists'=>true})
这一切都很好用。 为此使用哈希字段:info
字段很好,因为我想要存储的内容没有固定的模式,因而不同。
好的,但是,我不能在:info
hash中使用相同的点语法来$set
键/值对。 [1]
thing.set("info.endDate"=>Time.now)
引发Mongoid::Errors::UnknownAttribute
错误。
它告诉我,我必须在我的模型中包含Mongoid::Attributes::Dynamic
才能做到这一点,但这对我来说似乎不对。 哈希字段类型的要点似乎是允许您处理没有固定模式的数据。 看起来我不应该包含一个特殊的“动态属性”模块来使用哈希字段。
所以现在,我正在使用常规的旧[]
语法更新值,然后在模型上调用save
,如下所示:
thing.info[:endDate] = Time.now thing.save
但是很多时候它只是$set
值会更好。 是否有其他语法来设置哈希字段值? 我错误的上述错误消息和动态属性是错误的? 我暂时不想对哈希字段进行两步更新吗?
[1]诚然,我最近从mongomapper迁移过来,所以我对这种语法的期望部分是由于能够在mongomapper中做到这一点。
Hash字段的东西是,它可以是你想要的动态。 因此,为了防止由代码中的错误导致的非预期字段污染数据库架构,默认情况下会禁用此function。
不,你根本没有使用哈希的两步更新!
[],[] =是read_attribute()
和read_attribute()
的快捷方式,如果不包含Mongoid::Attributes::Dynamic
,则应该使用它们。 如果您尝试在不启用动态属性的情况下使用$set
,则会收到无方法错误,因为它不会将您的动态属性视为已定义的属性。
如果您将阅读Mongoid :: Attributes :: Dynamic的源代码,那么您会发现这是添加动态属性function所必需的。
要通过包含Mongoid::Attributes::Dynamic
来更新值,您需要按照以下步骤操作:
thing = Thing.first thing.set("info.endDate" => Time.now) thing.reload # This will update the current variable
否则,如果您需要,可以轻松跳过此步骤,并通过两步法进行值更新
我希望这能为您的查询提供一些启示。
资源:
Rails mongoid动态字段 – 没有方法错误
使用Rails和Mongoid的动态属性
我认为你以错误的方式传递参数。 用逗号替换箭头符号
您可以更改为此,它将起作用
thing.set("info.endDate", Time.now)