Module: Likeable

Extended by:
ActiveSupport::Concern
Defined in:
lib/likeable.rb,
lib/likeable/facepile.rb,
lib/likeable/module_methods.rb

Defined Under Namespace

Modules: ClassMethods, Facepile, UserMethods Classes: Like

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.after_like(&block) ⇒ Object



61
62
63
64
65
# File 'lib/likeable/module_methods.rb', line 61

def after_like(&block)
  @after_like = block if block.present?
  @after_like ||= lambda {|like|}
  @after_like
end

.classesObject



11
12
13
# File 'lib/likeable/module_methods.rb', line 11

def classes
  (@classes||[]).flatten
end

.classes=(*args) ⇒ Object



15
16
17
# File 'lib/likeable/module_methods.rb', line 15

def classes=(*args)
  @classes = args
end

.find_by_resource_id(resource_name, target_id) ⇒ Object

Likeable.find_by_resource_id(“highlight”, 22) —————————————- # #<Highlight id: … # if highlight 22 exists nil # if highlight 22 does not exist



33
34
35
36
37
38
39
40
# File 'lib/likeable/module_methods.rb', line 33

def find_by_resource_id(resource_name, target_id)
  target = Likeable.get_class_for_resource_name(resource_name)
  if target.present?
    Likeable.find_one(target, target_id)
  else
    false
  end
end

.find_many(klass, ids) ⇒ Object



71
72
73
74
# File 'lib/likeable/module_methods.rb', line 71

def find_many(klass, ids)
  @find_many ||= lambda {|klass, ids| klass.where(:id => ids)}
  @find_many.call(klass, ids)
end

.find_many=(find_many) ⇒ Object



67
68
69
# File 'lib/likeable/module_methods.rb', line 67

def find_many=(find_many)
  @find_many = find_many
end

.find_one(klass, id) ⇒ Object



77
78
79
80
# File 'lib/likeable/module_methods.rb', line 77

def find_one(klass, id)
  @find_one ||= lambda {|klass, ids| klass.where(:id => id).first}
  @find_one.call(klass, id)
end

.find_one=(find_one) ⇒ Object



82
83
84
# File 'lib/likeable/module_methods.rb', line 82

def find_one=(find_one)
  @find_one = find_one
end

.get_class_for_resource_name(resource_name) ⇒ Object

Likeable.get_class_for_resource_name(‘photo’) ————————- # Returns the class for the resource name



45
46
47
# File 'lib/likeable/module_methods.rb', line 45

def get_class_for_resource_name(resource_name)
  self.model(resource_name)
end

.get_resource_name_for_class(klass) ⇒ Object



49
50
51
# File 'lib/likeable/module_methods.rb', line 49

def get_resource_name_for_class(klass)
  klass
end

.model(target_model) ⇒ Object

Likeable.model(“Highlight”) ————————- # turns a string into a model “Highlight”.constantize # => Highlight; “Hi1i6ht”.constantize = #=> false



23
24
25
26
27
# File 'lib/likeable/module_methods.rb', line 23

def model(target_model)
  target_model.camelcase.constantize
rescue NameError => ex
  return false
end

.redisObject



53
54
55
# File 'lib/likeable/module_methods.rb', line 53

def redis
  @redis ||= Redis.new
end

.redis=(redis) ⇒ Object



57
58
59
# File 'lib/likeable/module_methods.rb', line 57

def redis=(redis)
  @redis = redis
end

.setup {|_self| ... } ⇒ Object

Likeable.setup do |like|

like.redis     = Redis.new(#...)
like.find_one  = lambda {|klass, id | klass.where(:id => id)}
like.find_many = lambda {|klass, ids| klass.where(:id => ids)}

end

Yields:

  • (_self)

Yield Parameters:

  • _self (Likeable)

    the object that the method was called on



104
105
106
107
# File 'lib/likeable/module_methods.rb', line 104

def setup(&block)
  yield self unless block.blank?
  true
end

.user_classObject



86
87
88
89
90
91
92
# File 'lib/likeable/module_methods.rb', line 86

def user_class
  begin
    @user_class ||= ::User
  rescue NameError
    nil
  end
end

.user_class=(klass) ⇒ Object

Raises:

  • (ArgumentError)


94
95
96
97
# File 'lib/likeable/module_methods.rb', line 94

def user_class=(klass)
  raise ArgumentError, "Argument must be a class" unless klass.is_a?(Class)
  @user_class = klass
end

Instance Method Details

#add_like_from(user, time = Time.now.to_f) ⇒ Object

create a like the user who created the like has a reference to the object liked



26
27
28
29
30
31
32
33
# File 'lib/likeable.rb', line 26

def add_like_from(user, time = Time.now.to_f)
  Likeable.redis.hset(like_key, user.id, time)
  Likeable.redis.hset(user.like_key(self.class.to_s.downcase), self.id, time)
  like = Like.new(:target => self, :user => user, :time => time)
  after_like(like)
  clear_memoized_methods(:like_count, :like_user_ids, :liked_user_ids, :liked_users, :likes)
  like
end

#after_like(like) ⇒ Object



41
42
43
# File 'lib/likeable.rb', line 41

def after_like(like)
  Likeable.after_like.call(like)
end

#clear_memoized_methods(*methods) ⇒ Object



35
36
37
38
39
# File 'lib/likeable.rb', line 35

def clear_memoized_methods(*methods)
  methods.each do |method|
    eval("@#{method} = nil")
  end
end

#destroy_all_likesObject



20
21
22
# File 'lib/likeable.rb', line 20

def destroy_all_likes
  liked_users.each {|user| self.remove_like_from(user) }
end

#like_countObject



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

def like_count
  @like_count ||= @like_user_ids.try(:count) || @likes.try(:count) || Likeable.redis.hlen(like_key)
end

#like_user_idsObject

get all user ids that have liked a target object



57
58
59
# File 'lib/likeable.rb', line 57

def like_user_ids
  @like_user_ids ||= (Likeable.redis.hkeys(like_key)||[]).map(&:to_i)
end

#likeable_resource_nameObject



81
82
83
# File 'lib/likeable.rb', line 81

def likeable_resource_name
  Likeable.get_resource_name_for_class(self.class)
end

#liked_by?(user) ⇒ Boolean

did given user like the object

Returns:

  • (Boolean)


74
75
76
77
78
# File 'lib/likeable.rb', line 74

def liked_by?(user)
  return false unless user
  liked_by =    @like_user_ids.include?(user.id) if @like_user_ids
  liked_by ||=  Likeable.redis.hexists(like_key, user.id)
end

#liked_users(limit = nil) ⇒ Object



61
62
63
# File 'lib/likeable.rb', line 61

def liked_users(limit = nil)
  @liked_users ||= Likeable.user_class.where(:id => like_user_ids)
end

#likesObject



65
66
67
68
69
70
71
# File 'lib/likeable.rb', line 65

def likes
  @likes ||= begin
    Likeable.redis.hgetall(like_key).collect do |user_id, time|
      Like.new(:user_id => user_id, :time => time, :target => self)
    end
  end
end

#remove_like_from(user) ⇒ Object

removes a like



46
47
48
49
50
# File 'lib/likeable.rb', line 46

def remove_like_from(user)
  Likeable.redis.hdel(like_key, user.id)
  Likeable.redis.hdel(user.like_key(self.class.to_s.downcase), self.id)
  clear_memoized_methods(:like_count, :like_user_ids, :liked_user_ids, :liked_users)
end