lib/likeable.rb in likeable-0.1.1 vs lib/likeable.rb in likeable-0.1.2

- old
+ new

@@ -1,9 +1,8 @@ require 'active_support/concern' require 'keytar' - module Likeable extend ActiveSupport::Concern included do include Keytar @@ -42,26 +41,33 @@ Likeable.after_like.call(like) end # removes a like 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) + if Likeable.redis.hexists(like_key, user.id) + Likeable.redis.hdel(like_key, user.id) + Likeable.redis.hdel(user.like_key(self.class.to_s.downcase), self.id) + after_unlike(user) + clear_memoized_methods(:like_count, :like_user_ids, :liked_user_ids, :liked_users) + end end + def after_unlike(user) + Likeable.after_unlike.call(user) + end + def like_count @like_count ||= @like_user_ids.try(:count) || @likes.try(:count) || Likeable.redis.hlen(like_key) end # get all user ids that have liked a target object def like_user_ids - @like_user_ids ||= (Likeable.redis.hkeys(like_key)||[]).map(&:to_i) + @like_user_ids ||= (Likeable.redis.hkeys(like_key)||[]).map {|id| Likeable.cast_id(id)} end def liked_users(limit = nil) - @liked_users ||= Likeable.user_class.where(:id => like_user_ids) + @liked_users ||= Likeable.find_many(Likeable.user_class, like_user_ids) end def likes @likes ||= begin Likeable.redis.hgetall(like_key).collect do |user_id, time| @@ -71,12 +77,12 @@ end # did given user like the object 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) + liked_by = @like_user_ids.include?(Likeable.cast_id(user.id)) if @like_user_ids + liked_by ||= true & Likeable.redis.hexists(like_key, user.id) end def likeable_resource_name Likeable.get_resource_name_for_class(self.class) @@ -85,29 +91,43 @@ ### Class Methods ### # ----------------- # # allows us to setup callbacks when creating likes # after_like :notify_users + # allows us to setup callbacks when destroying likes + # after_unlike :notify_users module ClassMethods def all_liked_ids_by(user) key = user.like_key(self.to_s.downcase) - ids = (Likeable.redis.hkeys(key)||[]).map(&:to_i) + ids = (Likeable.redis.hkeys(key)||[]).map {|id| Likeable.cast_id(id)} end def all_liked_by(user) ids = all_liked_ids_by(user) - self.where(:id => ids) + Likeable.find_many(self, ids) end def after_like(*methods) define_method(:after_like) do |like| methods.each do |method| eval("#{method}(like)") end end end + + def after_unlike(*methods) + define_method(:after_unlike) do |user| + methods.each do |method| + eval("#{method}(user)") + end + end + end end + + autoload :DefaultAdapter , "likeable/adapters/default_adapter" + autoload :MongoidAdapter , "likeable/adapters/mongoid_adapter" + autoload :OhmAdapter , "likeable/adapters/ohm_adapter" end require 'likeable/like' require 'likeable/facepile' require 'likeable/user_methods'