ruby-on-rails-6 - Rails 6警告:覆盖现有方法.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(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
作为 article_commons_statesengines
,。name
AS sengines_name FROMarticle_commons
INNER JOINdirectory_keywords
ONdirectory_keywords
。article_dir_id
=article_commons
。内部id
加入。= 。内部 加入。= 。和。 = 'ArticleEngine' 在哪里。= 'ArticleDir' 和. 在(1217)和。= TRUE 分组依据。, .keywords
keywords
id
directory_keywords
keyword_id
sengines
sengines
id
article_commons
sengine_id
sengines
type
article_commons
type
keywords
id
article_commons
active
article_commons
state
sengines
name
=> {["过期", "数据..."]=>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 ]
为了配合您的明确范围,您会看到此警告。