module ActiveRedis::Relation::InstanceMethods

Public Instance Methods

create_relation_methods() click to toggle source

Generate methods for relations.

@return [void]

# File lib/active_redis/relation.rb, line 13
def create_relation_methods
  self.class.instance_eval do
    (@has_many || []).each do |x|
      define_method(x.to_s.pluralize) do
        klazz = Object.const_get(x.to_s.capitalize.singularize)
        klazz.where(
          basename: "#{basename}:#{x.to_s.downcase.pluralize}")
      end
    end
    (@belongs_to || []).each do |x|
      keys.merge!({"#{x.to_s.downcase.singularize}_id".to_sym => Integer}) 
      define_method(x.to_s.singularize) do 
        klazz = Object.const_get(x.to_s.capitalize.singularize) 
        klazz.find send("#{x.to_s.downcase.singularize}_id") 
      end 
    end 
    (@has_one || []).each do |x| 
      define_method(x.to_s) do 
        klazz = Object.const_get(x.to_s.capitalize.singularize) 
        klazz.find_by(basename: "#{basename}:"+
                      "#{x.to_s.downcase.singularize}") 
      end 
    end 
  end 
end
handle_relation(relation_key: nil, value: nil, action: :add) click to toggle source

Create a set for each relation. This is needed to fetch directly the objects by id from redis store. Nobody wan’t to do it only at application level.

@param relation_key [String] Like Author - Post.author_id @param value [String] @param action [:add,:del]

@return [void]

# File lib/active_redis/relation.rb, line 50
def handle_relation relation_key: nil, value: nil, action: :add
  blto = self.class.instance_variable_get(:@belongs_to)
  relation = relation_key.to_s[/^([a-z_]+)_id$/,1].to_s
  if blto.is_a?(Array) and
    blto.include?(relation.to_sym)
    if action == :add
      connection.sadd(
        "#{relation.pluralize}:#{value}:#{self.class.cname}",
        id)
    elsif action == :del
      connection.srem(
        "#{relation.pluralize}:"+
        "#{value || send(relation_key)}:"+
        "#{self.class.cname}",
        id)
    end
  end
end