问题描述
我有一个 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.
就我个人而言,我只会使用默认范围将记录按日期顺序排序,因此 first
和 last
返回有用的结果(在使用 uuid 时很有帮助,因为与整数 id 不同,记录没有特别的命令)。但有些人甚至会不同意这一点!