繁体   English   中英

Rails:定义要覆盖的 scope 的正确方法

[英]Rails: correct way to define a scope to be overridden

我正在使用被丢弃的 gem,它在加载它的每个 model 上添加了一个 scope with_discarded。 为了编写一些适用于任何 model 的代码,我在 application_record 中的所有模型上添加了 with_discarded scope (通过 class 方法),这些模型不执行任何操作,因此这些模型中的模块将被丢弃的 gem 覆盖

但是,rails 现在会产生警告: Creating scope:with_discarded. Overwriting existing method User.with_discarded 每次我加载覆盖基本方法的 class 时,都会Creating scope:with_discarded. Overwriting existing method User.with_discarded 为了完整性,它的实现方式如下:

  def self.with_discarded 
    all
  end

现在一切似乎都运行良好,但我想知道正确的方法是什么以及为什么我被警告。 我是否应该将其定义为 scope 而不是 class 方法(编辑:尝试过仍会收到警告)? 或者,有没有办法从我的所有日​​志中过滤掉这个警告,而不加载像 Semantic Logger 这样的 gem。 问题是每次我的 GoodJob Scheduler 运行并污染我的日志时都会出现此警告。

所以我按照@tadman的建议,刚刚实现了一个新方法如下

  def self.include_discarded
    respond_to?(:with_discarded) ? with_discarded : all
  end

这并没有让我重载原始的 with_discarded scope,因为我必须将所有用途切换到 include_discarded 但它具有相同的效果。 您可以尝试通过元编程为该方法赋予相同的名称,但是您需要一种在 ApplicationRecord 的每个子类中运行代码的好方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM