Static Record Cache
This plugin has two options for caching records of Static classes which change rarely or never
acts_as_static_record
Permanently caches subclasses of ActiveRecord that contains data that changes rarely.
Includes support for:
-
Find by Id, all, first (association lookups)
-
Cached caluculations:
Neighborhood.count
s, sum, max, min -
Convenience lookups:
Neighborhood[:seattle]
-
Additional support for column name lookups:
Neighborhood.find_by_name 'Seattle'
Install
sudo gem install static_record_cache --source=http://gemcutter.org
script/plugin install git://github.com/blythedunham/static_record_cache.git
Usage
class SomeMostlyStaticClass < ActiveRecord::Base
acts_as_static_record
end
Any finds that do not contain additional conditions, joins, and other arguments become a cache call. One advantage over the query cache is that the static cache is searched eliminating the need for ActiveRecord
to generate SQL
When a cache key is specified with option :key
, additional finder methods for ids and fields such as find_by_id
and find_by_name_and_mother
are overwritten to search the cache when no arguments (conditions) are specified. If the cache key is not a column, then a finder method will be defined.
acts_as_static_record :key => :some_instance_method
Will define find_by_some_instance_method(value)
Options
-
:key
- a method or column of the instance used to specify a cache key. This should be unique. -
:find
an additional find scope to specify:conditions
,:joins
,:select
, <tt>:joins</ff> etc -
:find_by_attribute_support
- set to true to add additional functionality for finders such asfind_by_id_and_name
to use a cache search. This option is probably best for Rails 2.3 -
:lookup_key
- access the record from the class by a key name likeUser[:snowgiraffe]
.:lookup_key
is the column on which do do the lookup.
Examples
Caches on Id and telephone carrier name
class TelephoneCarrier < ActiveRecord::Base
acts_as_static_method :key => :name
end
Caches the WhiteList on phone_number_digits (in addition to ID)
create_table :sms_white_list, :force => true do |t|
t.column :phone_number_id, :integer, :null => false
t.column :notes, :string, :length => 100, :default => nil
end
class SmsWhiteList < ActiveRecord::Base
belongs_to :phone_number
acts_as_static_record :key => :phone_number_digits,
:find => :select => 'carriers.*, phone_number.number as phone_number_digits'
:joins => 'inner join phone_numbers on phone_numbers.carrier_id = carriers.id'
def phone_number_digits
self['phone_number_digits']||self.phone_number.number
end
end
Direct cache hits
SmsWhiteList.find_by_phone_number_digits('12065551234')
SmsWhiteList.find_by_id(5)
SmsWhiteList.find :all
Searched cache hits
SmsWhiteList.find_by_notes('Some note')
Calculation Support
Now with calculate
support for sum
, min
, and max
for integer columns and count
for all columns Cache hits do not occur if options other than distinct
are used.
Cache hits:
Neighborhood.count
Neighborhood.count :name, :distinct => true
Neighborhood.sum :id
Neighborhood.max :id
Not cache hits:
Neighborhood.max :name
Neighborhood.count :zip_code, :conditions => ['name = ?', 'Seattle']
Convenience lookup
Similar to acts_as_enumeration model returns the record where the acts_as_static_record :key
option matches lookup
If no key is specified, the primary_id column is used
class User < ActiveRecord::Base
acts_as_static_record :key => :user_name
end
Then later we can reference the objects by the user_name
User[:blythe]
User['snowgiraffe']
The key used will be the underscore version of the name. Punctuation marks are removed. The following are equivalent:
User[:blythe_snowgiraffeawesome]
User['blythe-SNOWGIRaffe AWESome']
user = User.first
User[user.user_name] == user
StaticActiveRecordContext
Extends the active_record_context plugin, svn.techno-weenie.net/projects/plugins/active_record_context/ to permanently cache records for an ActiveRecord subclass
Finds on records IDS (as used by associations) will be cached for the life of the class. This works both in and outside a with_context block.
Example
class TelephoneCarriers < ActiveRecord::Base
extend StaticActiveRecordContext
end
phone_number.carrier
Developers
-
Blythe Dunham snowgiraffe.com
Docs
Homepage
-
Github Project: github.com/blythedunham/static_record_cache/tree/master
-
Install:
script/plugin install git://github.com/blythedunham/static_record_cache.git