在我的Post.rb模型中,我有default_scope :conditions => {:deleted => 'false'}
但是如果我尝试运行Post.find(:all, :conditions => "deleted='false'")
,它将不会返回任何内容。就像default_scope优先于所有内容一样。
我想要它,以便当我Post.find()
时它不会返回已删除的帖子,但我也希望能够在需要时访问它们。在我的查询或我的Rails模型中需要更改什么?
感谢。
答案 0 :(得分:60)
答案 1 :(得分:17)
with_exclusive_scope
是protected
,因此您必须创建一个类方法:
def self.include_deleted_in
Event.with_exclusive_scope { yield }
end
然后在您的控制器调用中
Post.include_deleted_in { Post.find(:all) }
答案 2 :(得分:1)
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应用程序看不到这些行。