19

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

但是如果我尝试运行Post.find(:all, :conditions => "deleted='false'"),它不会返回任何东西。就好像 default_scope 优先于一切。

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

谢谢。

4

4 回答 4

60

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

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

这要归功于 José Valim

于 2010-10-17T19:00:39.423 回答
17

with_exclusive_scopeprotected,所以你必须创建一个类方法:

def self.include_deleted_in
  Event.with_exclusive_scope { yield }
end

然后在你的控制器调用中

Post.include_deleted_in { Post.find(:all) }
于 2010-01-15T18:15:24.760 回答
1

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

另请注意,在 Rails 3 中,ActiveRecord 使用Arel进行大量查询构造,这将大大提高 ActiveRecord 查询生成的能力,同时简化许多内部结构。使用 Arel 可能会改善您的情况。同时,我建议不要将条件放在 default_scope 中,除非您确实希望对 Rails 应用程序不可见的行。

于 2010-01-15T18:13:02.060 回答
1

使用with_exclusive_scope

 Post.with_exclusive_scope { Post.find(:all) }
于 2010-01-15T17:52:40.640 回答