蒙古身份映射设置在Rails控制台中不生效



似乎没有从config/mongoid.yml文件中拾取identity_map设置

文件如下:

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时出现此问题。

: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

查看: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中。

最新更新