Rails 6 警告:覆盖现有方法<model_name>.fetched_state



Rails 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(主):108:0> ArticleDir.article_engine_counts(关键字)

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

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

(1.7毫秒) 选择计数(*)作为count_all,article_commons.statearticle_commons_state,sengines.namearticle_commons内部连接sengines_namedirectory_keywordsdirectory_keywords.article_dir_id=article_commons.idkeywords上的内部连接keywordsid=directory_keywords.keyword_id内部联接sengines开启sengines.id=article_commons.sengine_idsengines.type= "文章引擎" 哪里article_commons.type= 'ArticleDir' ANDkeywords.id(1217)和article_commons.active= 真组 通过article_commons.statesenginesname

=> {["已过期", "数据..."]=>1, ["已获取", "数据..."]=>83, ["源", " 数据..."]=>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 以某种方式覆盖了模型上的这两个范围。

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

当您有诸如枚举之类的内容向模型添加作用域时,可能会发生这种情况。

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

enum status: [ :active, :archived ]

为了配合您的显式范围,您将看到此警告。

相关内容

  • 没有找到相关文章