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 мс) SELECT COUNT (*) AS count_all, article_commons
. state
AS article_commons_state, sengines
. name
AS sengines_name FROM article_commons
INNER JOIN directory_keywords
ON directory_keywords
. article_dir_id
= article_commons
. id
INNER JOIN keywords
ON keywords
. id
= directory_keywords
. keyword_id
INNER JOIN sengines
ON sengines
. id
= article_commons
. sengine_id
И sengines
. type
= 'ArticleEngine' ГДЕ article_commons
. type
= 'ArticleDir' И keywords
. id
IN (1217) И article_commons
. active
= ИСТИНА GROUP BY article_commons
. state
, sengines
. name
=> {["expired", "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 каким-то образом перезаписывает эти две области действия модели.
Если так, то почему? и что мне с этим делать?