2015-10-27 10 views
5

Tôi đang lưu trữ dữ liệu linh tinh của người dùng trong bảng user_data và khi tôi lấy dữ liệu đó với liên kết mà tôi đã xác định và sau đó tôi thực sự lưu bộ nhớ đệm bằng cách sử dụng bộ nhớ đệm Biến thể giống như thế này.Bộ nhớ đệm biến thể của Ruby on Rails dựa trên tham số

def user_data(user_id) 
    @user_data || = User.find(user_id).data 
end 

nhưng trường hợp biến @user_data giá trị sẽ được phân bổ thời gian chỉ đầu tiên khi nó bằng không và dừng khi nó giữ dữ liệu cho một người sử dụng cho phép nói cho user_id bằng 1, và khi tôi đi qua user_id 2 trong phương pháp này đó là trở về dữ liệu cho user_id 1, bởi vì nó sẽ không phân bổ giá trị mới cho nó nên câu hỏi của tôi là làm thế nào tôi có thể cache giá trị của nó dựa trên các tham số của hàm.

Trả lời

7

Hãy xem qua số Caching with Rails guide. Rails có thể lưu trữ dữ liệu trên nhiều cấp độ từ bộ nhớ đệm trang đầy đủ đến bộ đệm ẩn, tôi khuyên bạn nên đọc tất cả các trang này để bạn có thể đưa ra lựa chọn nhận thức.

Đối với bộ nhớ đệm cấp thấp bạn có thể làm điều này:

@user_data = Rails.cache.fetch("user_#{user_id}", expires_in: 1.hour) do 
    User.find(user_id).data 
end 

By Rails cửa hàng mặc định bộ nhớ cache trên đĩa, nhưng bạn có thể thiết lập cho memcache, bộ nhớ lưu trữ, và vv

+0

Đây là cách bạn sẽ triển khai bằng cách sử dụng bộ nhớ đệm Rails. Điều này không được nhầm lẫn với bộ nhớ đệm biến thể hiện mặc dù, câu hỏi là về. Đã bỏ phiếu :-) – kaspernj

1

Bạn có thể sử dụng một hàm băm cho bộ nhớ cache biến quan trọng dựa trên khóa. Tôi nghĩ rằng những gì bạn muốn.

def user_data(user_id) 
    @user_data ||= {} 
    @user_data[user_id.to_i] || = User.find(user_id).data 
end