2009-05-19 27 views
5

Tôi biết rằng trong đường ray 2.3.2 truy vấn ActiveRecord được lưu trữ, ví dụ: bạn có thể thấy một cái gì đó trong nhật ký phát triển/sản xuất:Các mô hình ActiveRecord được lưu trong các tác vụ rake?

CACHE (0.0ms) SELECT * FROM `users` WHERE `users`.`id` = 1 

Tôi đã tự hỏi nếu các nguyên tắc tương tự áp dụng để cào nhiệm vụ.

Tôi có một công việc cào sẽ truy vấn rất nhiều mô hình khác nhau và tôi muốn biết liệu tôi có nên triển khai bộ nhớ đệm của riêng mình hoặc nếu hành vi này được bao gồm theo mặc định.

Ngoài ra, có cách nào để xem các truy vấn sql được thực hiện trong tác vụ rake không? Tương tự như nhật ký phát triển/sản xuất

Trả lời

1

Nhiệm vụ cào sẽ chạy trong môi trường bạn chỉ định, trong trường hợp đó, nó sẽ áp dụng các quy tắc của môi trường đó.

Bạn có thể thiết lập các đường ray env từ dòng lệnh:

RAILS_ENV=test 

Logging có thể được thiết lập như là một phần của cái cào và bạn sẽ thấy điều này trong Rails bình thường của bạn đăng nhập.

2

Bạn đang nói về ActiveRecord Query Caching. Điều đó cũng sẽ hoạt động trong Rake-Task, miễn là bạn đang chạy chúng trong môi trường có bộ nhớ đệm được bật, ví dụ: production. Xem Rails Guide on Caching để biết ví dụ.

Nó có thể hoặc có thể không phải là loại bên phải của bộ nhớ đệm cho trường hợp của bạn:

u1=User.find 1 # loads user1 first time from DB 
u2=User.find 2 # loads user2 first time from DB 
u1again = User.find 1 # loads user1 from cache 
all = User.all # loads user1 and user2 from DB again 
+0

Tôi nghĩ rằng điều đó có thể chỉ đúng trong bộ điều khiển. Có văn bản ở đây: "điều quan trọng cần lưu ý là bộ đệm truy vấn được tạo khi bắt đầu một hành động và bị hủy ở cuối hành động đó và do đó chỉ tồn tại trong suốt thời gian thực hiện hành động." Bạn nên xem nhật ký môi trường của mình (ví dụ: log/test.log, nếu bạn chọn câu trả lời ở trên) và bạn sẽ thấy các truy vấn SQL lặp lại. – chug2k

1

Bộ nhớ cache SQL không được kích hoạt mỗi mặc định cho các nhiệm vụ cào. Bạn có thể bao bọc mã của mình trong một khối bộ nhớ cache, như sau:

task :foobar => :environment do 
    ActiveRecord::Base.connection.cache do 
    User.find 1 # Will hit the db 
    User.find 1 # Will hit the cache 
    end 
end 

Đây thực chất là những gì Rails làm cho hành động của bộ điều khiển. Lưu ý rằng bộ nhớ cache sử dụng bộ nhớ và các tác vụ cào có xu hướng làm việc với các tập dữ liệu lớn, có thể cung cấp cho bạn các vấn đề. Bạn có thể chọn không tham gia chọn lọc bộ nhớ đệm cho các phần trong mã của mình bằng cách sử dụng uncached

Các vấn đề liên quan