lib/redis/objects.rb in redis-objects-0.4.0 vs lib/redis/objects.rb in redis-objects-0.4.1

- old
+ new

@@ -74,35 +74,44 @@ # Class methods that appear in your class when you include Redis::Objects. module ClassMethods attr_accessor :redis, :redis_objects - # Set the Redis prefix to use. Defaults to model_name - def prefix=(prefix) @prefix = prefix end - def prefix #:nodoc: - @prefix ||= self.name.to_s. + # Set the Redis redis_prefix to use. Defaults to model_name + def redis_prefix=(redis_prefix) @redis_prefix = redis_prefix end + def redis_prefix(klass = self) #:nodoc: + @redis_prefix ||= klass.name.to_s. sub(%r{(.*::)}, ''). gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). gsub(/([a-z\d])([A-Z])/,'\1_\2'). downcase end - def field_key(name, id='') #:nodoc: + def redis_field_key(name, id='') #:nodoc: + klass = first_ancestor_with(name) # This can never ever ever ever change or upgrades will corrupt all data - @redis_objects[name.to_sym][:key] || "#{prefix}:#{id}:#{name}" + klass.redis_objects[name.to_sym][:key] || "#{redis_prefix(klass)}:#{id}:#{name}" end + + def first_ancestor_with(name) + if redis_objects && redis_objects.key?(name.to_sym) + self + elsif superclass && superclass.respond_to?(:redis_objects) + superclass.first_ancestor_with(name) + end + end end # Instance methods that appear in your class when you include Redis::Objects. module InstanceMethods def redis() self.class.redis end - def field_key(name) #:nodoc: - # This can never ever ever ever change or upgrades will corrupt all data - if key = self.class.redis_objects[name.to_sym][:key] + def redis_field_key(name) #:nodoc: + klass = self.class.first_ancestor_with(name) + if key = klass.redis_objects[name.to_sym][:key] eval "%(#{key})" else - # don't try to refactor into class field_key because fucks up eval context - "#{self.class.prefix}:#{id}:#{name}" + # don't try to refactor into class redis_field_key because fucks up eval context + "#{klass.redis_prefix}:#{id}:#{name}" end end end end end