如何修复弃用警告:类级别方法将不再继承 Rails 6.1 中的范围?

Posted

技术标签:

【中文标题】如何修复弃用警告:类级别方法将不再继承 Rails 6.1 中的范围?【英文标题】:How to fix DEPRECATION WARNING: Class level methods will no longer inherit scoping from in Rails 6.1? 【发布时间】:2020-02-27 06:19:15 【问题描述】:

最近将我的 Rails 应用程序更新到 6.0。当我运行我的测试时,我从Referral 模型的范围内收到以下弃用警告:

DEPRECATION WARNING: Class level methods will no longer inherit scoping from `with_all_final_state_fulfillments` in Rails 6.1. To continue using the scoped relation, pass it into the block directly. To instead access the full set of models, as Rails 6.1 will, use `Referral.unscoped`. (called from block in <class:Referral> at /Users/home/workspace/APPNAME/app/models/referral.rb:60)

我有问题的Referral 模型范围很老套,但写成这样:

  scope :with_all_final_state_fulfillments, lambda 
    final_state_ids = Referral.with_fulfillment_in_final_state.pluck(:id).uniq
    not_final_state_ids = Referral.where(id: final_state_ids).with_fulfillment_not_in_final_state.pluck(:id).uniq

    id_list = final_state_ids - not_final_state_ids
    Referral.where(id: id_list)
  

我在互联网上搜索了有关如何解决此弃用的建议,includingthe Rails GitHub PR 正在做出更改,但在任何地方都没有找到明确的English explanation。

如何修复 Rail 6.1 的这个已弃用的范围?

【问题讨论】:

【参考方案1】:

通过将Referral. 的内部范围调用更新为self.,使弃用警告消失:

  scope :with_all_final_state_fulfillments, lambda 
    final_state_ids = self.with_fulfillment_in_final_state.pluck(:id).uniq
    not_final_state_ids = self.where(id: final_state_ids).with_fulfillment_not_in_final_state.pluck(:id).uniq

    id_list = final_state_ids - not_final_state_ids
    where(id: id_list)
  

【讨论】:

另一种可能的解决方案可能是使用Referral.default_scoped.x

以上是关于如何修复弃用警告:类级别方法将不再继承 Rails 6.1 中的范围?的主要内容,如果未能解决你的问题,请参考以下文章

如何选择性地静音 Rails 3 弃用警告?

如何修复 Xcode 7.3 警告:`init` 已弃用:它将在 Swift 3 中删除:在序列上使用`enumerate()` 方法 [重复]

如何修复“UIPopoverController 已弃用”警告?

在 Heroku 中运行任务的 Rails 2.3 样式插件和弃用警告

如何修复已弃用的“按钮样式”

如何修复“弃用警告:Collection#filterArray:使用 Collection#filter”?