【问题标题】:Mongoid default scope overrides default value. Why?Mongoid 默认范围覆盖默认值。为什么?
【发布时间】:2015-10-07 14:15:12
【问题描述】:

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

然后我做:

t=Test.new; t.successful
=> true

那么问题来了:这种行为背后的原因是什么?

P.S.我已经在after_initialize方法的帮助下修复了它重置successful

【问题讨论】:

  • 这听起来像是一个错误。您是否确认是 default_scope 导致了这种情况?
  • @Drenmi 当我使用 default_scope 删除行时一切正常,所以我猜是的。
  • @muistooshort t 当然,现在修好了,我的错。

标签: ruby-on-rails ruby mongodb mongoid default


【解决方案1】:

尝试调用Test.create(),成功也是如此。这看起来很奇怪,但想想你在你的 default_scope 中所说的话......得到所有真实的测试。

这看起来像是来自 active_record 最初的东西:rails3 default_scope, and default column value in migration 但是严格遵循 active_record 这应该可以工作,但它不会:

t= Test.unscoped.new; t.successful
=> true

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    相关资源
    最近更新 更多