如何绕过 default_scope 但仍然能够在 Rails 中使用命名范围

问题描述

我有一个 User 模型,其中有一个 default_scope 来获取所有仍处于活动状态的用户。除了认范围,我还有命名范围。我的用户模型看起来像:

default_scope { where(status: "active") }

scope :location,-> (location) { where(location: location) }

对于特定查询,我需要绕过 default_scope 并使用位置范围。我知道我可以使用 unscoped 绕过作用域,但根据我的理解,unscope 将绕过所有作用域。

我该怎么做?

解决方法

您可以绕过默认范围,然后应用您的自定义范围,如下所示:

User.unscoped.location('London')

不过,您确实需要按此顺序执行此操作,否则(如您所说)unscoped 调用将删除在它之前调用的作用域。

另外,请考虑不要以这种方式使用默认范围。如果您想(如本例中那样)检索不活动的用户,就会遇到问题。您可能最好拥有一个 active 范围(也许还有一个 inactive 范围),您可以在需要该限制时调用它,而在不需要时不要调用!这样,您的代码将更清楚地了解您希望返回的记录。

User.active.location('London')
User.inactive.location('London')
User.all.location('London')
etc.

就我个人而言,我只会使用默认范围将记录按日期顺序排序,因此 firstlast 返回有用的结果(在使用 uuid 时很有帮助,因为与整数 id 不同,记录没有特别的命令)。但有些人甚至会不同意这一点!