ActiveRecord中default_scope的替代方案

时间:2011-08-03 01:18:11

标签: ruby-on-rails ruby-on-rails-3 activerecord scope named-scope

我遇到了更改应用程序功能的问题,不得不重新编写大约700个现在需要确定范围的方法调用。

我一直在调查default_scope是如何运作的,和大多数人一样,我发现它很接近,但对我来说并不是很有帮助,因为我无法轻易地覆盖它。

当前提供的覆盖default_scope的rails是unscoped方法。 unscoped的问题在于它完全删除了所有范围,而不仅仅是默认范围。

我真的很喜欢Rails / ActiveRecord大师的一些选择。

鉴于此基本所需功能...

class Model < ActiveRecord::Base
  ...      
  belongs_to :user
  ...
  default_scope where(:foo => true)
  scope :baz, where(:baz => '123')
  scope :sans_foo, without_default.where(:foo=>true)
  ...
end

你能/你怎么能创建一个方法,可以删除默认范围,同时保持其他范围保持不变? IE,目前如果您使用...

user.models.unscoped.where(something)

......与调用

相同
Model.where(something)

是否可以定义一种方法,允许你做这样的事情......

user.models.without_default.where(something)

...结果仍然是用户范围,但不包括默认范围?

我非常非常感谢有关如何实施此功能的任何帮助或建议。

1 个答案:

答案 0 :(得分:0)

您必须使用with_exclusive_scope

http://apidock.com/rails/ActiveRecord/Base/with_exclusive_scope/class

User.with_exclusive_scope do
  user.models.baz.where(something)
end