Можно ли кешировать пользовательские sql запросы в Rails?
В home_controller моего приложения на Rails 4 я выполняю собственный SQL-запрос и сохраняю результаты в переменной экземпляра.
@studentscoring = ActiveRecord::Base.connection.execute sql_string_student
Я тогда, после установки кеширования на true в разработке конфигаconfig.action_controller.perform_caching = true
и перезапустите приложение, настройте кэширование вокруг соответствующей переменной в представлении.
...... #code ommitted
Обновление браузера три раза показывает, что запрос выполняется три раза, и последний запуск запроса на самом деле занимает на 0,7 мс дольше, чем первый, поэтому я 'Я предполагаю, что кэширование не работает, или яя не делаю это правильно :). Можете ли вы сказать мне, что яя делаю неправильно?
Не будучи экспертом по каким-либо стандартам, я нене понимаю, как кеширование может быть запущено из представления с помощью <% cache ... do%> синтаксис, так как к тому времени, когда представление загружает гаваньt запросы контроллера уже были выполнены, поэтому он 'не слишком ли поздно сказать Rails использовать кэшированную копию?
с логов сервера ...
Первый
(1.1ms) with cte_scoring as (
select
users.id, users.name, users.email,
(select Coalesce(sum(value),0) from answer_votes where (answer_votes.user_id = users.id) AND (created_at >= Current_Date - interval '7 day')) +
(select Coalesce(sum(value),0) from best_answers where (best_answers.user_id = users.id) AND (created_at >= Current_Date - interval '7 day')) +
(select Coalesce(sum(value),0) from contributions where (contributions.user_id = users.id) AND (created_at >= Current_Date - interval '7 day')) total_score
from
users
where
users.student = 'true')
select id,
name,
email,
total_score
from cte_scoring
order by total_score desc
limit 5
третий
(1.8ms) with cte_scoring as (
select
users.id, users.name, users.email,
(select Coalesce(sum(value),0) from answer_votes where (answer_votes.user_id = users.id) AND (created_at >= Current_Date - interval '7 day')) +
(select Coalesce(sum(value),0) from best_answers where (best_answers.user_id = users.id) AND (created_at >= Current_Date - interval '7 day')) +
(select Coalesce(sum(value),0) from contributions where (contributions.user_id = users.id) AND (created_at >= Current_Date - interval '7 day')) total_score
from
users
where
users.student = 'true')
select id,
name,
email,
total_score
from cte_scoring
order by total_score desc
limit 5
Обновить
Журналы показывают, что он читает фрагмент (после выполнения вышеупомянутых запросов), так почему запросы будут иметь разное время, а более поздний запрос будет медленнее? Я бы подумал, что запросы не будутне запускается вообще, если есть фрагмент для чтения.
Read fragment views/id/75/name/Retarded Student/email/[email protected]/total_score/0/id/83/name/Jim Beam/email/[email protected]/total_score/0/id/79/name/Weird Student/email/[email protected]/total_score/0/id/80/name/VegetableSTudent/email/[email protected]/total_score/0/c9638e467bfd0fbf5b619ab411182256 (0.3ms)