在使用Rails 3.2.13和Mongoid 3.1.2时出现此问题。
似乎没有从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
为什么没有正确加载设置?
: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
中。