How to cache data in a plugin


I'm using CountryCodes to get countries list for select box. It provides self.countries_for_select(*args) method exactly for this purpose. I'm using it in only one place in my view. So I was thinking about caching this data somehow, so it won't have to be recreated every time the page is loaded.

The problem is that the plugin initializes its main @countries variable in init.rb file by calling method CountryCodes.load_countries_from_yaml.

Is there an easier way to cache this data than doing something like this:

lib/country_codes.rb module CountryCodes   ...   def self.cache_countries_for_select     @cached_countries_for_select = countries_for_select('name', 'a2').sort.freeze   end   def self.cached_countries_for_select     @cached_countries_for_select   end   ... end

init.rb require 'country_codes' CountryCodes.load_countries_from_yaml CountryCodes.cache_countries_for_select

I don't think that caching this data will make huge performance gain, I'm rather trying to do it to understand Ruby and Rails better.

The Ruby way of caching the result of a cost operation in a variable is:

def self.countries_for_select     @cached_countries_for_select ||= countries_for_select('name', 'a2').sort.freeze   end

The "||=" returns the value in @cached_countries_for_select "or", if it is nil (will be first time), fetch the value and stores in the variable.

This is pure Ruby, nothing to do with Rails.

If you want to learn some cool Rails techniques, including the use of page/fragmant cache to better solve cases like this, I recommend