2015-10-27 11 views
5

Przechowuję różne dane użytkownika w tabeli user_data i kiedy pobieram te dane z powiązaniem, które zdefiniowałem, a następnie faktycznie zapisuję je w pamięci podręcznej przy użyciu bufora zmiennych języka Ruby.Buforowanie zmiennych instancji Ruby on Rails w oparciu o parametry

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

ale instancja zmiennej @user_data zostanie przydzielona wartość tylko raz pierwszy, gdy jest zero i po jego przechowywania danych dla użytkownika powiedzmy dla user_id równą 1, a gdy jestem przechodzącej user_id 2 w tej metodzie jest to powrót danych dla id_użytkownika 1, ponieważ nie przydzieli nowej wartości, więc moje pytanie brzmi: jak mogę buforować jego wartość na podstawie parametrów funkcji.

Odpowiedz

7

Spójrz na Caching with Rails guide. Railsy mogą buforować dane na wielu poziomach od pełnego buforowania stron do buforowania fragmentów, zdecydowanie radzę przeczytać całą tę stronę, aby móc dokonać świadomego wyboru.

Dla buforowania niskiego poziomu można to zrobić:

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

Domyślnie Rails sklepach pamięci podręcznej na dysku, ale można skonfigurować do memcache, przechowywania pamięci, itp

+0

W ten sposób można go wdrożyć za pomocą buforowania Rails. Nie należy tego mylić z buforowaniem zmiennych instancji, o co chodzi w tym pytaniu. Wycofano :-) – kaspernj

1

Można użyć mieszanie dla bazującej na kluczach zmiennej intance zmiennej. Myślę, że robi to, co chcesz.

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