2011-01-08 30 views
11

Trong Ruby on Rails bạn có thể tìm thấy bản ghi từ cơ sở dữ liệu với cú pháp này:Ruby on Rails: Làm thế nào để thiết lập "tìm" tùy chọn để không sử dụng bộ nhớ cache

<model_name>.find_by_<field_name>() 

Ví dụ: User.find_by_email('[email protected]'), User.find_by_id(1),. ..

Thời gian trước, nếu tôi không sai, tôi đọc một nơi nào đó mà bạn có thể vô hiệu hóa bộ nhớ đệm cho hoạt động 'tìm' một cách rõ ràng, nhưng tôi không thể nhớ như thế nào.

Ai đó có thể giúp tôi nhớ không?

+0

Tôi chưa thấy thiết lập bộ nhớ đệm theo mặc định ... Bạn có chắc không? bạn đã kiểm tra nhật ký của mình chưa? – apneadiving

+0

Tôi đồng ý với sự sẵn lòng. Tôi không nghĩ rằng nó được lưu trữ theo mặc định. –

Trả lời

18

Bạn có thể sử dụng ActiveRecord::QueryCache.uncached như thế này:

User.find_by_email('[email protected]') 
User.find_by_email('[email protected]') # Will return cached result 

User.uncached do 
    User.find_by_email('[email protected]') 
    User.find_by_email('[email protected]') # Will query the database again 
end 

Trong một bộ điều khiển, nó sẽ giống như thế này:

def show # users#index action 
    User.uncached do 
    @user = User.find_by_email('[email protected]') 
    @another_user = User.find_by_email('[email protected]') # Will query database   
    end 

    User.find_by_email('[email protected]') # Will *not* query database, as we're outside of the Users.uncached block 
end   

Rõ ràng, trong một mô hình, bạn chỉ cần phải làm:

class User < ActiveRecord::Base 
    def self.do_something 
    uncached do 
     self.find_by_email('[email protected]') 
     self.find_by_email('[email protected]') # Will query database 
    end 
    end 
end 

User.do_something # Will run both queries 
+0

Tôi không hiểu cách sử dụng các mã này: những gì tôi phải đặt thay vì 'self.find (...)'? Bạn có thể làm một ví dụ thực tế? – user502052

+0

Tôi đã cập nhật các ví dụ của mình nhưng thật khó khi bạn chỉ cho tôi mã trừu tượng. Bạn có muốn sử dụng điều này trong một bộ điều khiển hoặc trong một mô hình? Nếu điều khiển, bạn có thể sử dụng ví dụ đầu tiên của tôi. Nếu mô hình, bạn có thể sử dụng cuối cùng của tôi. Nó có thể dễ dàng hơn nếu bạn đăng những gì bạn đang cố gắng làm, thay vì tôi cố gắng đưa ra các ví dụ có ý nghĩa với bạn. – vonconrad

+0

Cảm ơn rất nhiều. – user502052

2

(Lưu ý:. Giả sử Rails3, vì Rails2 không có bộ nhớ đệm mặc định)

này nên làm việc như bạn muốn nó ra khỏi hộp:

  1. Queries cache bị phá hủy sau mỗi hành động (http://guides.rubyonrails.org/caching_with_rails.html đoạn 1.5)
  2. Ngoài ra, có vẻ như (http://ryandaigle.com/articles/2007/2/7/what-s-new-in-edge-rails-activerecord-explicit-caching) bộ nhớ cache đó cũng bị hủy trên các cập nhật thuộc tính/bản ghi

Bạn có trường hợp sử dụng cụ thể không được cấu hình mặc định không?

+0

Tôi đang cố giải quyết vấn đề này một cách khác biệt: http://stackoverflow.com/questions/4636704/chache-problem-running-two-consecutive-http-get-requests-from-an-app1-to-an-app2 – user502052

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