在Rails中覆盖default_scope

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

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

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

谢谢。

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

 def self.include_deleted_in Event.with_exclusive_scope { yield } end 

然后在你的控制器调用

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

这个人不知何故被隐藏了:)

如果你正在使用Rails 3,只需使用Post.unscoped.where(:deleted => true)

感谢JoséValim 。

使用with_exclusive_scope

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

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

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