覆盖Rails中的多个默认范围之一

时间:2014-04-15 16:05:29

标签: ruby-on-rails activerecord ruby-on-rails-4 rails-activerecord

我有两个模块添加到对象的默认范围。

module Testable
  extend ActiveSupport::Concern

  included do
    default_scope { where(test_only: false) }
  end
end

module ActiveScoped
  extend ActiveSupport::Concern

  included do
    default_scope { where(active: true) }
  end
end

当我在模型类中包含这两个模块时,查询在where中都包含这两个子句。这两者都必须是默认范围的原因是因为有更多的地方必须应用这些范围而不是。此外,忘记在这些地方之一中应用示波器的成本很高。因此,在几个地方明确指定它不适用似乎是一个更好的选择。但是,我现在需要编写一个方法,可以从模型中获取所有对象,只应用其中一个范围。我怎么能这样做?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

我不喜欢在模块中定义default_scope然后包含它的想法。这对于模型本身来说听起来更自然。

但是,您仍然可以使用unscoped删除这些默认范围。

Foo.all
# Returns relation object with current two default scopes

Foo.unscoped
# Returns all results without any scope

Foo.unscoped do
  where(active: true)
end
# Returns object with only one scope applied