У меня есть представление, использующее кеширование фрагментов для отношения ActiveRecord
, например.
<% cache MyModel.all do %>
...
<% end %>
В этом случае я вижу два запроса к БД
SELECT COUNT(*) AS "size", MAX("my_model"."updated_at") AS timestamp FROM "my_model"
SELECT "my_model".* from "my_model"
Я ожидаю первого, и обычно это гораздо более эффективный запрос. Я не ожидал второго.
Если я вместо этого использую:
<% cache ActiveSupport::Cache.expand_cache_key(MyModel.all) do %>
...
<% end %>
тогда я получаю только первый запрос с таким же результирующим ключом кеша.
Это ошибка или я что-то не так делаю?
РЕДАКТИРОВАТЬ: сузился до того места, где это происходит: см. https://github.com/rails/rails/pull/29092#issuecomment-437572543
when
normalize_version
is executed, the relation does not respond tocache_version
, and therefore ends up being expanded withto_a
. So essentially, callingProduct.all.to_a
and then for each object callingcache_version
, which returnsnil
.
Да, это действительно похоже на ошибку. Надеюсь, это будет исправлено на этом PR, поскольку мой собственный PR для исправления временного промежутка был отклоненный