如何绕过 default_scope 但仍然能够在 Rails 中使用命名作用域
How to bypass default_scope but still be able to use named scopes in Rails
我有一个用户模型,其中有一个 default_scope 来获取所有仍然活跃的用户。除了默认范围外,我还有命名范围。我的用户模型看起来像:
default_scope { where(status: "active") }
scope :location, -> (location) { where(location: location) }
对于特定查询,我需要绕过 default_scope 并使用位置范围。我知道我可以使用 unscoped 来绕过一个范围,但根据我的理解,unscope 将绕过所有范围。
我该怎么做?
您可以绕过默认范围,然后应用您的自定义范围,如下所示:
User.unscoped.location('London')
不过,您确实需要按此顺序进行,否则(如您所说)unscoped
调用将删除之前调用的范围。
此外,请考虑不要以这种方式使用默认范围。如果您想要(如本例所示)检索非活动用户,就会遇到问题。您最好有一个 active
范围(也许还有一个 inactive
范围),您可以在需要该限制时调用它,而在您不需要时调用 not吨!这样,您的代码将更清楚地了解您希望返回的记录。
User.active.location('London')
User.inactive.location('London')
User.all.location('London')
etc.
就个人而言,我只会使用默认范围将记录按日期顺序排序,因此 first
和 last
return 有用的结果(在使用 uuid 时很有用,因为与整数 id 不同,记录不分先后)。但有些人甚至会不同意!
我有一个用户模型,其中有一个 default_scope 来获取所有仍然活跃的用户。除了默认范围外,我还有命名范围。我的用户模型看起来像:
default_scope { where(status: "active") }
scope :location, -> (location) { where(location: location) }
对于特定查询,我需要绕过 default_scope 并使用位置范围。我知道我可以使用 unscoped 来绕过一个范围,但根据我的理解,unscope 将绕过所有范围。
我该怎么做?
您可以绕过默认范围,然后应用您的自定义范围,如下所示:
User.unscoped.location('London')
不过,您确实需要按此顺序进行,否则(如您所说)unscoped
调用将删除之前调用的范围。
此外,请考虑不要以这种方式使用默认范围。如果您想要(如本例所示)检索非活动用户,就会遇到问题。您最好有一个 active
范围(也许还有一个 inactive
范围),您可以在需要该限制时调用它,而在您不需要时调用 not吨!这样,您的代码将更清楚地了解您希望返回的记录。
User.active.location('London')
User.inactive.location('London')
User.all.location('London')
etc.
就个人而言,我只会使用默认范围将记录按日期顺序排序,因此 first
和 last
return 有用的结果(在使用 uuid 时很有用,因为与整数 id 不同,记录不分先后)。但有些人甚至会不同意!