设置mongoid哈希字段值

Bee*_*Bee 14 ruby-on-rails mongodb mongoid mongoid4

我在Rails项目中使用Mongoid(均为4.0.x),并且我有一个带有哈希字段的文档,该字段存储一些无模式数据.

class Thing
  field :name, type: String
  field :mass, type: Integer
  field :info, type: Hash
end
Run Code Online (Sandbox Code Playgroud)

通过这种设置,我可以查询具有如下关键字的内容:endDate:

Thing.where("info.endDate"=>{'$exists'=>true})
Run Code Online (Sandbox Code Playgroud)

这一切都很好用.对这个:info字段使用哈希字段是很好的,因为我想要存储的东西没有固定的模式,并且从一个东西到另一个东西各不相同.

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

thing.set("info.endDate"=>Time.now) 
Run Code Online (Sandbox Code Playgroud)

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

它告诉我,我必须Mongoid::Attributes::Dynamic在我的模型中包含这样做,但这对我来说似乎不对.哈希字段类型的要点似乎是允许您处理没有固定模式的数据.我似乎不应该包含一个特殊的"动态属性"模块来使用哈希字段.

所以现在,我正在使用常规的旧[]语法更新值,然后调用save模型,如下所示:

thing.info[:endDate] = Time.now
thing.save
Run Code Online (Sandbox Code Playgroud)

但是很多时候它会发生这样$set的价值更好.是否有其他语法来设置哈希字段值?我错误的上述错误消息和动态属性是错误的?我暂时不想对哈希字段进行两步更新吗?

[1]不可否认,我最近从mongomapper迁移过来,所以我对这种语法的期望部分是由于能够在mongomapper中做到这一点.

Jag*_*ngh 11

Hash字段的内容是,它可以是您想要的动态.因此,为了防止因代码中的错误导致的非预期字段污染数据库模式,默认情况下会禁用此功能.

不,你根本没有使用哈希的两步更新!

[] [] =是快捷方式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 
Run Code Online (Sandbox Code Playgroud)

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

我希望这能为您的查询提供一些启示.

资源:

Rails mongoid动态字段 - 没有方法错误

使用Rails和Mongoid的动态属性