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