【问题标题】:Rails 6 warning: Overwriting existing method <model_name>.fetched_stateRails 6 警告:覆盖现有方法 <model_name>.fetched_state
【发布时间】:2025-12-15 03:10:01
【问题描述】:

导轨 6.0.2.1 ruby 2.6.5p114(2019-10-01 修订版 67812)[x86_64-linux]

我的 ArticleDir 类有 2 个作用域:

scope :active, -> { where(active: true).where(expired_on: nil) }
scope :fetched_state, -> { where(state: ArticleDir::FETCHED.to_s) }

还有一个功能:

def article_engine_counts(keyword_reln = Keyword.active_keywords)
      joins(:keywords, :article_engine)
      .where(Keyword.contains(keyword_reln))
      .where(self.table[:active].eq(true))
      .group(:state, ArticleEngine.table[:name]).count
end

在 Rails 控制台中运行该函数时,我得到:

irb(main):108:0> ArticleDir.article_engine_counts(keyword)

创建范围:活动。覆盖现有方法 ArticleDir.active。

创建范围:fetched_state。覆盖现有方法 ArticleDir.fetched_state。

(1.7ms) SELECT COUNT(*) AS count_all, article_commons.state AS article_commons_state, sengines.name AS sengines_name FROM article_commons INNER JOIN directory_keywords 开启 directory_keywords.article_dir_id = article_commons.id INNER JOIN keywords ON keywords.id = directory_keywords.keyword_id 内连接 sengines ON sengines.id = article_commons.sengine_id AND sengines.type = 'ArticleEngine' WHERE article_commons.type = 'ArticleDir' AND keywords.id IN (1217) AND article_commons.active = TRUE 组 BY article_commons.state, sengines.name

=> {["过期", "data..."]=>1, ["fetched", "data..."]=>83, ["sourced", "data..."] =>81}

我看到了另一个关于这个问题的参考: https://github.com/rails/rails/issues/31234 有人建议该消息与覆盖内核方法有关。

我检查了内核,内核上没有这样的方法可以覆盖:

irb(main):002:0> Kernel.methods.grep(/active/)
=> []
irb(main):004:0> Kernel.methods.grep(/fetched_state/)
=> []

我假设该消息意味着它似乎暗示的内容 - arel / rails 以某种方式覆盖了模型上的这两个范围。

如果是这样,为什么?我该怎么办?

【问题讨论】:

    标签: ruby-on-rails-6 arel


    【解决方案1】:

    当您有诸如枚举之类的东西向模型添加范围时,就会发生这种情况。

    如果在您的模型中,您有一个以 :active 作为值之一的枚举,例如:

    enum status: [ :active, :archived ]
    

    要配合您的显式范围,您会看到此警告。

    【讨论】:

      最近更新 更多