Trong home_controller của Rails của tôi 4 ứng dụng, tôi thực hiện một truy vấn tùy chỉnh sql và lưu kết quả vào một thể hiện biếnCó thể cache truy vấn sql tùy chỉnh trong Rails không?
@studentscoring = ActiveRecord::Base.connection.execute sql_string_student
tôi sau đó, sau khi cài đặt bộ nhớ đệm để đúng trong phát triển cấu hình config.action_controller.perform_caching = true
và khởi động lại ứng dụng, thiết lập lên bộ nhớ đệm xung quanh biến có liên quan trong chế độ xem.
<% 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 %>
Refreshing trình duyệt ba lần cho thấy rằng các truy vấn được chạy ba thời điểm khác nhau và thời gian cuối cùng của truy vấn thực sự mất .7ms dài hơn lần đầu tiên, vì vậy tôi giả sử bộ nhớ đệm không hoạt động hoặc tôi không làm đúng cách :). Bạn có thể cho tôi biết tôi đang làm gì sai không?
Không phải là chuyên gia theo bất kỳ tiêu chuẩn nào, tôi không hiểu cách bộ nhớ đệm có thể được kích hoạt từ chế độ xem với bộ nhớ cache <% ... do%> cú pháp, do thời gian lượt xem không có truy vấn điều khiển đã được chạy, do đó quá muộn để yêu cầu Rails sử dụng bản sao được lưu trong bộ nhớ cache?
từ các bản ghi máy chủ ...
Đầu tiên
(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
3rd
(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
Cập nhật
Các bản ghi hiển thị rằng nó được đọc một đoạn (sau khi truy vấn trên được chạy), vậy tại sao các truy vấn có thời gian khác nhau và truy vấn sau đó chậm hơn? Tôi đã có thể nghĩ rằng các truy vấn sẽ không được chạy ở tất cả nếu có một mảnh để đọc từ.
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)
Câu hỏi hay! Bộ nhớ đệm ActiveRecord dường như là rất nhiều bộ lạc truyền thuyết - tôi đã có một thời gian khó khăn tìm tài liệu rõ ràng để trả lời câu hỏi của bạn. – RyanWilcox