module ActiveRedis::Attributes
Public Instance Methods
attr_accessible(*attrs)
click to toggle source
# File lib/active_redis/attributes.rb, line 33 def attr_accessible(*attrs) @attr_accessible = attrs.map(&:to_sym) end
attr_accessible?(attr)
click to toggle source
# File lib/active_redis/attributes.rb, line 37 def attr_accessible?(attr) @attr_accessible.nil? || @attr_accessible.include?(attr.to_sym) end
boolean_field(field_name, options)
click to toggle source
# File lib/active_redis/attributes.rb, line 189 def boolean_field(field_name, options) attributes_module.module_eval %Q{ def #{field_name}_object Redis::Value.new(#{field_name}_redis_key, self.class.redis) end def #{field_name}_val return @attributes[:#{field_name}] if @attributes[:#{field_name}].boolean? @attributes[:#{field_name}] ||= begin value = #{field_name}_object.value value = "false" unless value.present? value.to_bool end end def #{field_name}? !!#{field_name} end def #{field_name}=(value) #{field_name}_will_change! if !value.boolean? value = value.to_bool else value = value end @attributes[:#{field_name}] = value end def set_#{field_name}(value) #{field_name}_object.value = value.last.to_s after_set(:#{field_name}) end } end
counter_field(field_name, options)
click to toggle source
# File lib/active_redis/attributes.rb, line 226 def counter_field(field_name, options) attributes_module.module_eval %Q{ def #{field_name}_object Redis::Counter.new(#{field_name}_redis_key, self.class.redis) end def #{field_name}_val @attributes[:#{field_name}] ||= #{field_name}_object.value.to_i end def #{field_name}=(#{field_name}) #{field_name}_will_change! @attributes[:#{field_name}] = #{field_name}.to_i end def set_#{field_name}(value) #{field_name}_object.value = value.last.to_i after_set(:#{field_name}) end def #{field_name}_inc(count) @attributes[:#{field_name}] = #{field_name}_object.increment(count) end def #{field_name}_dec(count) @attributes[:#{field_name}] = #{field_name}_object.decrement(count) end } end
date_field(field_name, options)
click to toggle source
# File lib/active_redis/attributes.rb, line 397 def date_field(field_name, options) string_field(field_name, options) attributes_module.module_eval %Q{ def #{field_name}_val @attributes[:#{field_name}] ||= begin value = #{field_name}_object.value if value.blank? nil else Date.parse(value) rescue nil end end end def #{field_name}=(value) value = ActiveRedis::NilObject.new if (Date.parse(value.to_s) rescue nil).blank? #{field_name}_will_change! value = ActiveRedis::NilObject.new if value.nil? @attributes[:#{field_name}] = value end def set_#{field_name}(value) #{field_name}_object.value = value.last.to_s after_set(:#{field_name}) end } end
define_field(field_name, options)
click to toggle source
# File lib/active_redis/attributes.rb, line 41 def define_field(field_name, options) define_attribute_method field_name attributes_module.module_eval %Q{ def #{field_name}_redis_key "#{self.redis_namespace}:\#{id}:#{field_name}" end def refresh_#{field_name}! @attributes[:#{field_name}] = nil #{field_name} end def destroy_#{field_name} Redis::Value.new(#{field_name}_redis_key, self.class.redis).delete end } if options[:finder_field] finder_field(field_name, options) end case options[:type] when :set set_field(field_name, options) when :sorted_set sorted_set_field(field_name, options) when :list list_field(field_name, options) when :hash hash_field(field_name, options) when :float float_field(field_name, options) when :int, :integer integer_field(field_name, options) when :counter counter_field(field_name, options) when :boolean boolean_field(field_name, options) when :date date_field(field_name, options) when :time, :datetime, :timestamp time_field(field_name, options) else string_field(field_name, options) end if options[:default] set_default(field_name, options[:default]) end end
finder_field(field_name, options)
click to toggle source
# File lib/active_redis/attributes.rb, line 446 def finder_field(field_name, options) before_save do if send("#{field_name}_changed?") self.class.redis.del(self.class.finder_key(field_name, send("#{field_name}_was"))) self.class.redis.set(self.class.finder_key(field_name, send(field_name)), id) end end class_eval %Q{ def self.find_by_#{field_name}(value) id = redis.get(finder_key(:#{field_name}, value)) if id.present? self.find(id) else nil end end } end
float_field(field_name, options)
click to toggle source
# File lib/active_redis/attributes.rb, line 155 def float_field(field_name, options) attributes_module.module_eval %Q{ def #{field_name}_object Redis::Value.new(#{field_name}_redis_key, self.class.redis) end def #{field_name}_val @attributes[:#{field_name}] ||= begin value = #{field_name}_object.value value.nil? ? value : value.to_f end end def #{field_name}=(value) #{field_name}_will_change! if value.nil? @attributes[:#{field_name}] = ActiveRedis::NilObject.new else @attributes[:#{field_name}] = value.to_f end end def set_#{field_name}(value) val = value.last if val.nil? destroy_#{field_name} else #{field_name}_object.value = val.to_f end after_set(:#{field_name}) end } end
hash_field(field_name, options)
click to toggle source
# File lib/active_redis/attributes.rb, line 366 def hash_field(field_name, options) attributes_module.module_eval %Q{ def #{field_name}_hash_set Redis::HashKey.new(#{field_name}_redis_key, self.class.redis) end def #{field_name}_val @attributes[:#{field_name}] ||= begin ActiveRedis::DirtyObjects::Hash[#{field_name}_hash_set.all] end end def #{field_name}=(value) value = {} if value.nil? #{field_name}.replace(value) end def set_#{field_name}(value) changes = value.first.last changes[:additions].each do |addition| #{field_name}_hash_set[addition] = changes[:hash][addition] end changes[:drops].each do |drop| #{field_name}_hash_set.delete(drop) end #{field_name}.clean! after_set(:#{field_name}) end } end
integer_field(field_name, options)
click to toggle source
# File lib/active_redis/attributes.rb, line 121 def integer_field(field_name, options) attributes_module.module_eval %Q{ def #{field_name}_object Redis::Value.new(#{field_name}_redis_key, self.class.redis) end def #{field_name}_val @attributes[:#{field_name}] ||= begin value = #{field_name}_object.value value.nil? ? value : value.to_i end end def #{field_name}=(value) #{field_name}_will_change! if value.nil? @attributes[:#{field_name}] = ActiveRedis::NilObject.new else @attributes[:#{field_name}] = value.to_i end end def set_#{field_name}(value) val = value.last if val.nil? destroy_#{field_name} else #{field_name}_object.value = val.to_i end after_set(:#{field_name}) end } end
list_field(field_name, options)
click to toggle source
# File lib/active_redis/attributes.rb, line 256 def list_field(field_name, options) attributes_module.module_eval %Q{ def #{field_name}_object Redis::List.new(#{field_name}_redis_key, self.class.redis) end def #{field_name}_val @attributes[:#{field_name}] ||= begin ActiveRedis::DirtyObjects::Array.new(#{field_name}_object.values) end end def #{field_name}=(array) if !array.is_a?(Array) && array.present? array = [array] end #{field_name}.replace(array.to_a) #{field_name} end def #{field_name}_force_load @attributes[:#{field_name}] = #{field_name}_object.values end def #{field_name}_count #{field_name}_object.count end def set_#{field_name}(value) new_value = value.last #{field_name}_object.clear #{field_name}_object.push(*new_value) if new_value.to_a.present? #{field_name}.clean! after_set(:#{field_name}) end } end
set_default(field_name, default)
click to toggle source
# File lib/active_redis/attributes.rb, line 466 def set_default(field_name, default) before_create do if send(field_name).blank? if default.is_a?(Proc) value = default.call(self) else value = default end send("#{field_name}=", value) end end end
set_field(field_name, options)
click to toggle source
# File lib/active_redis/attributes.rb, line 297 def set_field(field_name, options) attributes_module.module_eval %Q{ def #{field_name}_object Redis::Set.new(#{field_name}_redis_key, self.class.redis) end def #{field_name}_val @attributes[:#{field_name}] ||= begin ActiveRedis::DirtyObjects::Array.new(#{field_name}_object.members) end end def #{field_name}=(array) #{field_name}.replace(array.to_a) end def #{field_name}_count #{field_name}_object.count end def set_#{field_name}(value) changes = value.first.last changes[:additions].each do |addition| #{field_name}_object.add(addition) end changes[:drops].each do |drop| #{field_name}_object.delete(drop) end #{field_name}.clean! after_set(:#{field_name}) end } end
sorted_set_field(field_name, options)
click to toggle source
# File lib/active_redis/attributes.rb, line 331 def sorted_set_field(field_name, options) attributes_module.module_eval %Q{ def #{field_name}_object Redis::SortedSet.new(#{field_name}_redis_key, self.class.redis) end def #{field_name}_val @attributes[:#{field_name}] ||= begin ActiveRedis::DirtyObjects::SortedSet.new(#{field_name}_object.members) end end def #{field_name}=(hash) hash = {} if hash.nil? #{field_name}.replace(hash) end def #{field_name}_count #{field_name}_object.count end def set_#{field_name}(value) changes = value.first.last changes[:additions].each do |addition| self.#{field_name}_object[addition] = changes[:hash].key(addition) end changes[:drops].each do |drop| self.#{field_name}_object.delete(drop) end #{field_name}.clean! after_set(:#{field_name}) end } end
string_field(field_name, options)
click to toggle source
# File lib/active_redis/attributes.rb, line 90 def string_field(field_name, options) attributes_module.module_eval %Q{ def #{field_name}_object Redis::Value.new(#{field_name}_redis_key, self.class.redis) end def #{field_name}_val @attributes[:#{field_name}] ||= begin value = #{field_name}_object.value value.nil? ? value : value.to_s end end def #{field_name}=(value) #{field_name}_will_change! value = ActiveRedis::NilObject.new if value.nil? @attributes[:#{field_name}] = value end def set_#{field_name}(value) val = value.last if val.nil? destroy_#{field_name} else #{field_name}_object.value = val end after_set(:#{field_name}) end } end
time_field(field_name, options)
click to toggle source
# File lib/active_redis/attributes.rb, line 425 def time_field(field_name, options) string_field(field_name, options) attributes_module.module_eval %Q{ def #{field_name}_val @attributes[:#{field_name}] ||= begin value = #{field_name}_object.value if value.blank? nil else Time.at(value.to_i) end end end def set_#{field_name}(value) #{field_name}_object.value = value.last.to_i after_set(:#{field_name}) end } end