lib/redis/objects.rb in redis-objects-0.5.0 vs lib/redis/objects.rb in redis-objects-0.5.1

- old
+ new

@@ -44,16 +44,17 @@ autoload :Sets, File.join(dir, 'sets') autoload :SortedSets, File.join(dir, 'sorted_sets') autoload :Values, File.join(dir, 'values') autoload :Hashes, File.join(dir, 'hashes') - class NotConnected < StandardError; end + class NotConnected < StandardError; end + class NilObjectId < StandardError; end class << self def redis=(conn) @redis = conn end def redis - @redis ||= $redis || raise(NotConnected, "Redis::Objects.redis not set to a Redis.new connection") + @redis ||= $redis || Redis.current || raise(NotConnected, "Redis::Objects.redis not set to a Redis.new connection") end def included(klass) # Core (this file) klass.instance_variable_set('@redis', @redis) @@ -72,11 +73,13 @@ end end # Class methods that appear in your class when you include Redis::Objects. module ClassMethods - attr_accessor :redis, :redis_objects + attr_writer :redis + attr_accessor :redis_objects + def redis() @redis ||= Objects.redis end # 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. @@ -84,14 +87,23 @@ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). gsub(/([a-z\d])([A-Z])/,'\1_\2'). downcase end - def redis_field_key(name, id='') #:nodoc: + def redis_field_key(name, id=nil) #:nodoc: klass = first_ancestor_with(name) - # This can never ever ever ever change or upgrades will corrupt all data - klass.redis_objects[name.to_sym][:key] || "#{redis_prefix(klass)}:#{id}:#{name}" + # READ THIS: This can never ever ever ever change or upgrades will corrupt all data + # I don't think people were using Proc as keys before (that would create a weird key). Should be ok + key = klass.redis_objects[name.to_sym][:key] + if key && key.respond_to?(:call) + key = key.call self + end + if id.nil? and !klass.redis_objects[name.to_sym][:global] + raise NilObjectId, + "[#{klass.redis_objects[name.to_sym]}] Attempt to address redis-object :#{name} on class #{klass.name} with nil id (unsaved record?) [object_id=#{object_id}]" + end + key || "#{redis_prefix(klass)}:#{id}:#{name}" end def first_ancestor_with(name) if redis_objects && redis_objects.key?(name.to_sym) self @@ -105,11 +117,19 @@ module InstanceMethods def redis() self.class.redis end def redis_field_key(name) #:nodoc: klass = self.class.first_ancestor_with(name) if key = klass.redis_objects[name.to_sym][:key] - eval "%(#{key})" + if key.respond_to?(:call) + key.call self + else + eval "%(#{key})" + end else + if id.nil? and !klass.redis_objects[name.to_sym][:global] + raise NilObjectId, + "Attempt to address redis-object :#{name} on class #{klass.name} with nil id (unsaved record?) [object_id=#{object_id}]" + end # don't try to refactor into class redis_field_key because fucks up eval context "#{klass.redis_prefix}:#{id}:#{name}" end end end