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)
我该如何写这个,所以每个字段对于模型都是可选的?
所以这里有一些特定于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_attribute和read_attribute(或它们的快捷方式,[]=并[]),因为这些将不会抛出NoMethodError■如果字段不存在.
希望有所帮助.当你习惯它时,它真的很简单.有关详细信息,请参阅:http://mongoid.org/docs/documents/dynamic.html
| 归档时间: |
|
| 查看次数: |
3019 次 |
| 最近记录: |