W home_controller moich Rails 4 aplikacji, mogę wykonać kwerendy niestandardowe sql i zapisać wyniki do instancji zmiennejCzy można buforować niestandardowe zapytania SQL w Railsach?
@studentscoring = ActiveRecord::Base.connection.execute sql_string_student
I wtedy, po ustawieniu buforowanie true w rozwoju config config.action_controller.perform_caching = true
i ponownego uruchomienia aplikacji, należy ustawić buforowanie wokół odpowiedniej zmiennej w widoku.
<% cache @studentscoring do%>
<% for lawyer in @studentscoring %>
<div class="span2">
<div class="row">
<%= tiny_gravatar_for lawyer['name'], lawyer['email'] %>
</div>
...... #code ommitted
</div>
<% end %>
<% end %>
Odświeżanie przeglądarki trzykrotnie pokazuje, że zapytanie jest prowadzony trzy oddzielne razy i ostatni bieg zapytania faktycznie ma .7ms dłuższe niż pierwszy, więc jestem zakładając buforowanie nie działa, czy jestem nie robię tego poprawnie :). Czy możesz mi powiedzieć, co robię źle?
Nie będąc ekspertem według jakichkolwiek standardów, nie rozumiem, jak można włączyć buforowanie z widoku z składnią% cache ... do%> <%, ponieważ do czasu wczytywania widoku nie ma Zapytania kontrolera zostały już uruchomione, dlatego jest zbyt późno, aby Rails mógł użyć kopii z pamięci podręcznej?
z logów serwera ...
Pierwszy
(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
3-ty
(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
Aktualizacja
Dzienniki pokazać, że czyta fragment (po przeprowadzeniu powyższych zapytań są uruchamiane), dlaczego więc kwerendy miałyby inne czasy, a późniejsza kwerenda wolniej? Sądziłem, że zapytania nie zostaną w ogóle uruchomione, jeśli istnieje fragment do odczytania.
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)
Dobre pytanie! Pamięć podręczna ActiveRecord wydaje się być bardzo popularna w plemionach - ciężko było mi znaleźć wyraźną dokumentację, która odpowie na twoje pytanie. – RyanWilcox