2013-05-13 61 views
1

config/mongoid.yml文件中看不到identity_map设置。Mongoid Identity Map设置在Rails控制台中不起作用

这里的文件:

development: 
    sessions: 
    default: 
     uri: mongodb://localhost:27017/test_development 
     options: &defaultopts 
     op_timeout: 60 
     allow_dynamic_fields: false 
     identity_map_enabled: true 
     preload_models: true 
     raise_not_found_error: false 

当这是通过RAILS_ENV=development rails console跑地图未开启:

$ RAILS_ENV=development rails c 
Loading development environment (Rails 3.2.13) 
[1] pry(main)> Mongoid.using_identity_map? 
=> false 
[2] pry(main)> Mongoid.identity_map_enabled? 
=> false 

即使尝试手动加载Mongoid和文件都不会改变:

[3] pry(main)> require 'mongoid' 
=> false 
[4] pry(main)> Mongoid.load!("./config/mongoid.yml") 
=> {"sessions"=> 
    {"default"=> 
    {"uri"=>"mongodb://localhost:27017/test_development", 
    "options"=> 
     {"op_timeout"=>60, 
     "allow_dynamic_fields"=>false, 
     "identity_map_enabled"=>true, 
     "preload_models"=>true, 
     "raise_not_found_error"=>false}}}} 
[5] pry(main)> Mongoid.using_identity_map? 
=> false 
[6] pry(main)> Mongoid.identity_map_enabled? 
=> false 

仅当我手动设置值时才会生效:

[8] pry(main)> Mongoid.identity_map_enabled = true 
=> true 
[9] pry(main)> Mongoid.using_identity_map?                                                  
=> true 
[10] pry(main)> Mongoid.identity_map_enabled? 
=> true 

为什么设置未正确加载?

这个问题发生在使用Rails 3.2.13和Mongoid 3.1.2。

回答

1

:options不应嵌套在:default中。 Mongoid期待看到mongoid.yml格式:

development: 
    sessions: 
    default: 
     uri: mongodb://localhost:27017/test_development 
    options: 
    op_timeout: 60 
    allow_dynamic_fields: false 
    identity_map_enabled: true 
    preload_models: true 
    raise_not_found_error: false 

source其中:options被加载。

$ pry 
[1] pry(main)> require 'mongoid' 
=> true 
[2] pry(main)> Mongoid.load!("./mongoid.yml", :production) 
=> {"sessions"=> 
    {"default"=>{"database"=>"mongoid_prod", "hosts"=>["localhost:27017"]}}, 
    "options"=>{"identity_map_enabled"=>true, "include_root_in_json"=>true}} 
[3] pry(main)> Mongoid.using_identity_map? 
=> true 
[4] pry(main)> 

编辑: 正如指出的@cbmanica,有多个地方options可以设置。例如,我们可以有:

development: 
    sessions: 
    default: 
     uri: mongodb://localhost:27017/test_development 
     options: 
     consistency: :strong 
    options: 
    op_timeout: 60 

对于那些MongoDB的数据库上设置的options,它们不能被嵌套的session内。查看defaults的来源。

+0

Mongoid文档似乎直接违背了你的断言:':options'不应该嵌套在':default'中:http://mongoid.org/en/mongoid/docs/installation.html。 – cbmanica 2013-05-30 23:04:21

+0

@cbmanica有多种选项可以设置,我编辑我的答案突出显示。在[documentation](http://mongoid.org/en/mongoid/docs/installation.html)中查看“Mongoid配置剖析”部分,了解多个选项设置的多个选项的示例。 – jwieringa 2013-05-31 23:57:16