class Socialization::RedisStores::Base

Protected Class Methods

actors(subject, klass, options = {}) click to toggle source
# File lib/socialization/stores/redis/base.rb, line 7
def actors(subject, klass, options = {})
  if options[:pluck]
    Socialization.redis.smembers(generate_forward_key(subject)).inject([]) do |result, element|
      result << element.match(/\:(\d+)$/)[1] if element.match(/^#{klass}\:/)
      result
    end
  else
    actors_relation(subject, klass, options).to_a
  end
end
actors_relation(subject, klass, options = {}) click to toggle source
# File lib/socialization/stores/redis/base.rb, line 18
def actors_relation(subject, klass, options = {})
  ids = actors(subject, klass, :pluck => :id)
  klass.where("#{klass.table_name}.id IN (?)", ids)
end
relation!(actor, subject, options = {}) click to toggle source
# File lib/socialization/stores/redis/base.rb, line 41
def relation!(actor, subject, options = {})
  unless options[:skip_check] || relation?(actor, subject)
    Socialization.redis.sadd generate_forward_key(subject), generate_redis_value(actor)
    Socialization.redis.sadd generate_backward_key(actor), generate_redis_value(subject)
    call_after_create_hooks(actor, subject)
    true
  else
    false
  end
end
relation?(actor, subject) click to toggle source
# File lib/socialization/stores/redis/base.rb, line 63
def relation?(actor, subject)
  Socialization.redis.sismember generate_forward_key(subject), generate_redis_value(actor)
end
remove_actor_relations(subject) click to toggle source
# File lib/socialization/stores/redis/base.rb, line 67
def remove_actor_relations(subject)
  forward_key = generate_forward_key(subject)
  actors = Socialization.redis.smembers forward_key
  Socialization.redis.del forward_key
  actors.each do |actor|
    Socialization.redis.srem generate_backward_key(actor), generate_redis_value(subject)
  end
  true
end
remove_subject_relations(actor) click to toggle source
# File lib/socialization/stores/redis/base.rb, line 77
def remove_subject_relations(actor)
  backward_key = generate_backward_key(actor)
  subjects = Socialization.redis.smembers backward_key
  Socialization.redis.del backward_key
  subjects.each do |subject|
    Socialization.redis.srem generate_forward_key(subject), generate_redis_value(actor)
  end
  true
end
Also aliased as: remove_victim_relations
remove_victim_relations(actor)
subjects(actor, klass, options = {}) click to toggle source
# File lib/socialization/stores/redis/base.rb, line 29
def subjects(actor, klass, options = {})
  if options[:pluck]
    Socialization.redis.smembers(generate_backward_key(actor)).inject([]) do |result, element|
      result << element.match(/\:(\d+)$/)[1] if element.match(/^#{klass}\:/)
      result
    end
  else
    subjects_relation(actor, klass, options).to_a
  end
end
Also aliased as: victims
subjects_relation(actor, klass, options = {}) click to toggle source
# File lib/socialization/stores/redis/base.rb, line 23
def subjects_relation(actor, klass, options = {})
  ids = subjects(actor, klass, :pluck => :id)
  klass.where("#{klass.table_name}.id IN (?)", ids)
end
Also aliased as: victims_relation
unrelation!(actor, subject, options = {}) click to toggle source
# File lib/socialization/stores/redis/base.rb, line 52
def unrelation!(actor, subject, options = {})
  if options[:skip_check] || relation?(actor, subject)
    Socialization.redis.srem generate_forward_key(subject), generate_redis_value(actor)
    Socialization.redis.srem generate_backward_key(actor), generate_redis_value(subject)
    call_after_destroy_hooks(actor, subject)
    true
  else
    false
  end
end
victims(actor, klass, options = {})
Alias for: subjects
victims_relation(actor, klass, options = {})
Alias for: subjects_relation

Private Class Methods

generate_backward_key(actor) click to toggle source
# File lib/socialization/stores/redis/base.rb, line 111
def generate_backward_key(actor)
  keys = key_type_to_type_names(self)
  if actor.is_a?(String)
    "#{keys[1].pluralize.capitalize}:#{actor}"
  else
    "#{keys[1].pluralize.capitalize}:#{actor.class}:#{actor.id}"
  end
end
generate_forward_key(subject) click to toggle source
# File lib/socialization/stores/redis/base.rb, line 102
def generate_forward_key(subject)
  keys = key_type_to_type_names(self)
  if subject.is_a?(String)
    "#{keys[0].pluralize.capitalize}:#{subject}"
  else
    "#{keys[0].pluralize.capitalize}:#{subject.class}:#{subject.id}"
  end
end
generate_redis_value(obj) click to toggle source
# File lib/socialization/stores/redis/base.rb, line 120
def generate_redis_value(obj)
  "#{obj.class.name}:#{obj.id}"
end
key_type_to_type_names(klass) click to toggle source
# File lib/socialization/stores/redis/base.rb, line 90
def key_type_to_type_names(klass)
  if klass.name.match(/Follow$/)
    ['follower', 'followable']
  elsif klass.name.match(/Like$/)
    ['liker', 'likeable']
  elsif klass.name.match(/Mention$/)
    ['mentioner', 'mentionable']
  else
    raise Socialization::ArgumentError.new("Can't find matching type for #{klass}.")
  end
end