Skip to content

Instantly share code, notes, and snippets.

@marcbowes
Created March 6, 2012 12:21
Show Gist options
  • Save marcbowes/1985958 to your computer and use it in GitHub Desktop.
Save marcbowes/1985958 to your computer and use it in GitHub Desktop.
module NameIdCache
def self.included(base)
m = Module.new
base.all.each do |record|
cache_key = NameIdCache.cache_key(base, record)
Rails.cache.write(cache_key, record.id)
m.__send__(:define_method, record.name) do
Rails.cache.fetch(cache_key) do
base.find_by_name!(record.name).id
end
end
end
base.extend(m)
end
def self.cache_key(base, record)
[self.name, base.name, record.name].join(":")
end
end
class DeliveryState < ActiveRecord::Base
include NameIdCache
end
# This results in:
# DeliveryState Load (0.2ms) SELECT `delivery_states`.* FROM `delivery_states`
# => DeliveryState(id: integer, name: string, created_at: datetime, updated_at: datetime)
DeliveryState.all.inspect # => [#<DeliveryState id: 1, name: "queued", created_at: "2012-03-06 12:10:35", updated_at: "2012-03-06 12:10:35">]
#
# How does it work?
#
# This does not hit the DB
DeliveryState.queued # => 1
NameIdCache.cache_key(DeliveryState, DeliveryState.first) # => "NameIdCache:DeliveryState:queued"
Rails.cache.read("NameIdCache:DeliveryState:queued") # => 1
#
# What if I nuke the cache?
#
Rails.cache.delete("NameIdCache:DeliveryState:queued") # => true
Rails.cache.read("NameIdCache:DeliveryState:queued") # => nil
# Results in DeliveryState Load (0.3ms) SELECT `delivery_states`.* FROM `delivery_states` WHERE `delivery_states`.`name` = 'queued' LIMIT 1
DeliveryState.queued # => 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment