2015-10-27 2 views
5

Я храню данные о разных данных в таблице user_data и когда я извлекаю эти данные с помощью ассоциации, которую я определил, а затем я на самом деле кэширую ее с помощью экземпляра Ruby Variable, такого как кеширование.Каскад переменной экземпляра Ruby on Rails на основе параметров

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

но экземпляр переменной @user_data будет выделено значение только первый раз, когда это ноль и один раз его хранения данных для пользователя позволяет сказать, что для user_id равным 1, и когда я передаю user_id 2 в этом методе это возвращает данные для user_id 1, потому что он не будет выделять ему новое значение, поэтому мой вопрос заключается в том, как я могу кэшировать его значение на основе параметров функции.

ответ

7

Посмотрите на Caching with Rails guide. Rails может кэшировать данные на нескольких уровнях от полного кэширования страниц до кэширования фрагментов, я настоятельно рекомендую вам прочитать всю эту страницу, чтобы вы могли сделать предполагаемый выбор.

Для кэширования низкого уровня вы можете сделать это:

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

По умолчанию Rails магазинов кэш на диске, но вы можете установить для кэша памяти, хранения памяти, и т.д.

+0

Так вы можете реализовать его, используя кеширование Rails. Это не следует путать с кэшированием переменных экземпляров, хотя вопрос, о котором идет речь. Приобретено :-) – kaspernj

1

Вы можете использовать хэш для ключевого ключа intance-variable-cache. Я думаю, что делает то, что вы хотите.

def user_data(user_id) 
    @user_data ||= {} 
    @user_data[user_id.to_i] || = User.find(user_id).data 
end 
Смежные вопросы