lib/has_karma.rb in thumbs_up-0.6.5 vs lib/has_karma.rb in thumbs_up-0.6.6
- old
+ new
@@ -11,11 +11,11 @@
module ClassMethods
def has_karma(voteable_type, options = {})
include ThumbsUp::Karma::InstanceMethods
extend ThumbsUp::Karma::SingletonMethods
self.karmic_objects ||= {}
- self.karmic_objects[voteable_type.to_s.classify.constantize] = [ (options[:as] ? options[:as].to_s.foreign_key : self.name.foreign_key), (options[:weight] || 1).to_f ]
+ self.karmic_objects[voteable_type.to_s.classify.constantize] = [ (options[:as] ? options[:as].to_s.foreign_key : self.name.foreign_key), [ (options[:weight] || 1) ].flatten.map(&:to_f) ]
end
end
module SingletonMethods
@@ -28,13 +28,19 @@
end
module InstanceMethods
def karma(options = {})
self.class.base_class.karmic_objects.collect do |object, attr|
- v = object.where(["#{Vote.table_name}.vote = ?", true]).where(["#{self.class.base_class.table_name}.#{self.class.base_class.primary_key} = ?", self.id])
+ v = object.where(["#{self.class.base_class.table_name}.#{self.class.base_class.primary_key} = ?", self.id])
v = v.joins("INNER JOIN #{Vote.table_name} ON #{Vote.table_name}.voteable_type = '#{object.to_s}' AND #{Vote.table_name}.voteable_id = #{object.table_name}.#{object.primary_key}")
v = v.joins("INNER JOIN #{self.class.base_class.table_name} ON #{self.class.base_class.table_name}.#{self.class.base_class.primary_key} = #{object.table_name}.#{attr[0]}")
- (v.count.to_f * attr[1]).round
+ upvotes = v.where(["#{Vote.table_name}.vote = ?", true])
+ downvotes = v.where(["#{Vote.table_name}.vote = ?", false])
+ if attr[1].length == 1 # Only count upvotes, not downvotes.
+ (upvotes.count.to_f * attr[1].first).round
+ else
+ (upvotes.count.to_f * attr[1].first - downvotes.count.to_f * attr[1].last).round
+ end
end.sum
end
end
end