How to cache data in a plugin

Hi,

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.

On 2 Mar, 14:19, Okada [email protected] wrote:

and stores in the variable.

I’m using CountryCodes to get countries list for select box. It
this:
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.

Thanks!

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