MongoDB和Mongoid - 动态字段

Cam*_*mel 2 ruby-on-rails mongodb mongoid

我正在使用MongoDB,但我并没有真正使用它的动态字段功能

  field :fb_followers => Integer
  field :twitter_followers => Integer
  field :twitter_rts => Integer
  field :link_visiting => Integer
  field :reduce_points_per_day => Integer
Run Code Online (Sandbox Code Playgroud)

我该如何写这个,所以每个字段对于模型都是可选的?

tkr*_*car 6

所以这里有一些特定于Mongoid的信息.首先,确保在您的配置中allow_dynamic_fields设置true(默认为true,但总是很好).

对于我的例子,这是世界上最简单的Mongoid类:

class Foobj
  include Mongoid::Document
  field :static_field
end
Run Code Online (Sandbox Code Playgroud)

所以,我们当然可以static_field正常设置:

ruby-1.9.2-p290 :012 > f = Foobj.create!(:static_field => 'barbaz!')
 => #<Foobj _id: 4ec1f2eb90a110143b000003, _type: nil, regular_field: nil, static_field: "barbaz!">
Run Code Online (Sandbox Code Playgroud)

但我们不能"动态"做一个动态领域,因为Mongoid还不知道它.

ruby-1.9.2-p290 :013 > f.dynamic_field = "hi"
NoMethodError: undefined method `dynamic_field=' for #<Foobj:0x000000044e7ee8>
Run Code Online (Sandbox Code Playgroud)

但是,我可以write_attribute用来写一个动态字段:

ruby-1.9.2-p290 :014 > f.write_attribute(:dynamic_field,"hi!")
 => "hi!"
ruby-1.9.2-p290 :015 > f
 => #<Foobj _id: 4ec1f2eb90a110143b000003, _type: nil, regular_field: nil, static_field: "barbaz!", dynamic_field: "hi!">
Run Code Online (Sandbox Code Playgroud)

而且,既然我已经在Mongoid中"创建"了该字段,我现在可以使用常规机制来访问字段,即使它不在我的类定义中:

ruby-1.9.2-p290 :017 > f.dynamic_field
 => "hi!"
Run Code Online (Sandbox Code Playgroud)

另请注意,如果您使用非Mongoid指定的字段加载Mongoid文档,您确实可以使用相同的方式访问它们:

ruby-1.9.2-p290 :028 > g = Foobj.first
 => #<Foobj _id: 4ec1f2eb90a110143b000003, _type: nil, regular_field: nil, dynamic_field: "hi!", static_field: "barbaz!">
ruby-1.9.2-p290 :029 > g.dynamic_field
 => "hi!"
Run Code Online (Sandbox Code Playgroud)

然而,动态下地干活最安全的方式是使用write_attributeread_attribute(或它们的快捷方式,[]=[]),因为这些将不会抛出NoMethodError■如果字段不存在.

希望有所帮助.当你习惯它时,它真的很简单.有关详细信息,请参阅:http://mongoid.org/docs/documents/dynamic.html