Class: Redis::Model

Inherits:
Object
  • Object
show all
Defined in:
lib/redis/model.rb

Defined Under Namespace

Modules: Marshal Classes: FieldProxy, ListProxy, SetProxy

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id) ⇒ Model

Returns a new instance of Model.



48
49
50
# File 'lib/redis/model.rb', line 48

def initialize(id)
  self.id = id
end

Class Attribute Details

.prefixObject

Defaults to model_name.dasherize



82
83
84
# File 'lib/redis/model.rb', line 82

def prefix
  @prefix
end

Instance Attribute Details

#idObject

Returns the value of attribute id.



46
47
48
# File 'lib/redis/model.rb', line 46

def id
  @id
end

Class Method Details

.create(values = {}) ⇒ Object Also known as: with_next_key

Creates new model instance with new uniqid NOTE: “sequence:model_name:id” key is used



87
88
89
# File 'lib/redis/model.rb', line 87

def create(values = {})
  populate_model(self.new(next_id))
end

.field(name, type = :string) ⇒ Object Also known as: value

Defines marshaled rw accessor for redis string value



96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/redis/model.rb', line 96

def field(name, type = :string)
  class_name = marshal_class_name(name, type)
  
  fields << {:name => name.to_s, :type => :type}
  if type == :string
    class_eval "def #{name}; @#{name} ||= redis[field_key('#{name}')]; end"
    class_eval "def #{name}=(value); @#{name} = redis[field_key('#{name}')] = value; end"
  else
    class_eval "def #{name}; @#{name} ||= Marshal::#{class_name}.load(redis[field_key('#{name}')]); end"
    class_eval "def #{name}=(value); @#{name} = value; redis[field_key('#{name}')] = Marshal::#{class_name}.dump(value) end"
  end
end

.fieldsObject

:nodoc:



137
138
139
# File 'lib/redis/model.rb', line 137

def fields #:nodoc:
  @fields ||= []
end

.list(name, type = :string) ⇒ Object

Defines accessor for redis list



111
112
113
114
115
116
117
# File 'lib/redis/model.rb', line 111

def list(name, type = :string)
  class_name = marshal_class_name(name, type)
  
  fields << {:name => name.to_s, :type => :list}
  class_eval "def #{name}; @#{name} ||= ListProxy.new(self.redis, field_key('#{name}'), Marshal::#{class_name}); end"
  eval_writer(name)
end

.marshal_class_name(name, type) ⇒ Object



128
129
130
# File 'lib/redis/model.rb', line 128

def marshal_class_name(name, type)
  Marshal::TYPES[type] or raise ArgumentError.new("Unknown type #{type} for field #{name}")
end

.redisObject

Redefine this to change connection options



133
134
135
# File 'lib/redis/model.rb', line 133

def redis
  @@redis ||= Redis.new
end

.set(name, type = :string) ⇒ Object

Defines accessor for redis set



120
121
122
123
124
125
126
# File 'lib/redis/model.rb', line 120

def set(name, type = :string)
  class_name = marshal_class_name(name, type)
  
  fields << {:name => name.to_s, :type => :set}
  class_eval "def #{name}; @#{name} ||= SetProxy.new(self.redis, field_key('#{name}'), Marshal::#{class_name}); end"
  eval_writer(name)
end

Instance Method Details

#delete(name = nil) ⇒ Object

Issues delete commands for all defined fields



57
58
59
60
61
62
63
64
65
# File 'lib/redis/model.rb', line 57

def delete(name = nil)
  if name
    redis.delete field_key(name.to_s)
  else
    self.class.fields.each do |field|
      redis.delete field_key(field[:name])
    end
  end
end

#redisObject

:nodoc:



52
53
54
# File 'lib/redis/model.rb', line 52

def redis #:nodoc:
  self.class.redis
end