在Rails中覆盖default_scope

时间:2010-01-15 17:10:39

标签: ruby-on-rails models default-scope

在我的Post.rb模型中,我有default_scope :conditions => {:deleted => 'false'}

但是如果我尝试运行Post.find(:all, :conditions => "deleted='false'"),它将不会返回任何内容。就像default_scope优先于所有内容一样。

我想要它,以便当我Post.find()时它不会返回已删除的帖子,但我也希望能够在需要时访问它们。在我的查询或我的Rails模型中需要更改什么?

感谢。

4 个答案:

答案 0 :(得分:60)

这个被隐藏了一段时间:)

如果您使用的是Rails 3,请使用Post.unscoped.where(:deleted => true)

此信用转到José Valim

答案 1 :(得分:17)

with_exclusive_scopeprotected,因此您必须创建一个类方法:

def self.include_deleted_in
  Event.with_exclusive_scope { yield }
end

然后在您的控制器调用中

Post.include_deleted_in { Post.find(:all) }

答案 2 :(得分:1)

使用with_exclusive_scope

 Post.with_exclusive_scope { Post.find(:all) }

答案 3 :(得分:1)

范围是可组合的,这意味着您可以组合它们并有效地应用所有条件。在这种情况下,ActiveRecord太天真,无法确定显式条件应该否定第一个条件。它只是构建了使用AND连接所有子句的查询。因此,default_scope具有最大的实用程序:order子句不可组合(无论如何在ActiveRecord 2.3的实现中)。还有更多讨论here

另请注意,在Rails 3中,ActiveRecord正在使用Arel进行大量查询构建,这将大大增加ActiveRecord查询生成的功能,同时简化了许多内部。 Arel很可能会改善你的情况。与此同时,我建议不要在default_scope中添加条件,除非您确实希望Rails应用程序看不到这些行。