Sha256: fd5ac2055d7425d9f17b693d32978f012e5dc9b5a7a67aaf4d48365e8b8414aa

Contents?: true

Size: 1.5 KB

Versions: 2

Compression:

Stored size: 1.5 KB

Contents

module RedisBackedModel
  class RedisBackedModel
    
    def initialize(attributes={})
      if attributes.class == Hash
        attributes.each do |key, value|
          add_to_instance_variables(key, value)
        end
      else
        raise ArgumentError
      end
    end
    
    def to_redis
      redis_commands = []
      redis_commands << redis_set_command
      instance_variables.each do | var |
        redis_commands << instance_variable_to_redis(var) if instance_variable_to_redis(var)
      end
      scores.each do |score|
        redis_commands << score.to_redis
      end
      redis_commands
    end
    
    private
    
      attr_reader :id, :scores
    
      def add_to_instance_variables(key, value)
        if key.match(/score_\[\w+\|\w+\]/)
          add_to_scores(key, value)
        else
          self.instance_variable_set("@#{key}", value) 
        end
      end
    
      def add_to_scores(key, value)
        @scores ||= []
        @scores << SortedSet.new(self.class, id, Hash[key,value])
      end
      
      def instance_variable_to_redis(instance_variable)
        "hset #{model_name_for_redis}:#{id} #{instance_variable.to_s.deinstance_variableize} #{instance_variable_get(instance_variable.to_s)}" unless instance_variable.to_s == '@id'
      end
        
      def model_name_for_redis
        class_as_string = self.class.to_s.demodulize.underscore        
      end
        
      def redis_set_command
        "sadd #{model_name_for_redis}_ids #{id}"
      end
      
  end
    
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
redis_backed_model-0.0.2 lib/redis_backed_model/redis_backed_model.rb
redis_backed_model-0.0.1 lib/redis_backed_model/redis_backed_model.rb