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