Mongoid默认范围覆盖默认值.为什么?

Max*_*nko 6 ruby default ruby-on-rails mongodb mongoid

mongoid 4.0.2

Test上课了:

class Test
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Paranoia

  field :successful,      type: Boolean, default: false

  default_scope  ->{ where(successful: true) }
end
Run Code Online (Sandbox Code Playgroud)

然后我做:

t=Test.new; t.successful
=> true
Run Code Online (Sandbox Code Playgroud)

所以这就是问题:这种行为背后的原因是什么?

PS我已经修复了它successfulafter_initialize方法的帮助下重置.

ABr*_*wne 1

尝试调用Test.create(),成功也会是true。这看起来很奇怪,但想想你在 default_scope 中所说的...得到所有正确的测试。

这看起来像最初来自 active_record 的东西:rails3 default_scope 和迁移中的默认列值,但是严格遵循 active_record 这应该可以工作,但它不能:

t= Test.unscoped.new; t.successful
=> true
Run Code Online (Sandbox Code Playgroud)

在 mongo 世界中,如果您设置 default_scope,它将使用该范围来限制所有对象,并假设您希望任何新内容也具有相同的默认值。解决方法是使用回调。您提到连接 after_initialize 这是一个不错的选择,但是您需要确保检查它是否已实际设置。另一种选择是使用命名范围而不是默认范围。