【问题标题】:How to bypass default_scope but still be able to use named scopes in Rails如何绕过 default_scope 但仍然能够在 Rails 中使用命名范围
【发布时间】:2021-07-24 04:17:43
【问题描述】:

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

default_scope { where(status: "active") }

范围 :location, -> (location) { where(location: location) }

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

我该怎么做?

【问题讨论】:

    标签: ruby-on-rails scopes


    【解决方案1】:

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

    User.unscoped.location('London')
    

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      相关资源
      最近更新 更多