lib/seems_rateable/model.rb in seems_rateable-1.0.10 vs lib/seems_rateable/model.rb in seems_rateable-1.0.11

- old
+ new

@@ -1,111 +1,112 @@ require 'active_support/concern' + module SeemsRateable - module Model - extend ActiveSupport::Concern + module Model + extend ActiveSupport::Concern - def rate(stars, user_id, dimension=nil) - if !has_rated?(user_id, dimension) - self.rates.create do |r| - r.stars = stars - r.rater_id = user_id - end - update_overall_average_rating(stars, dimension) - elsif has_rated?(user_id, dimension) && can_update? - update_users_rating(stars, user_id, dimension) - else - raise Errors::AlreadyRatedError - end - end + def rate(stars, user_id, dimension=nil) + if !has_rated?(user_id, dimension) + self.rates.create do |r| + r.stars = stars + r.rater_id = user_id + r.dimension = dimension + end + update_overall_average_rating(stars, dimension) + elsif has_rated?(user_id, dimension) && can_update? + update_users_rating(stars, user_id, dimension) + else + raise Errors::AlreadyRatedError + end + end - def update_overall_average_rating(stars, dimension=nil) - if average(dimension).nil? - CachedRating.create do |r| - r.avg = stars - r.dimension = dimension - r.cacheable_id = self.id - r.cacheable_type = self.class.name - r.cnt = 1 - end - else - r = average(dimension) - r.avg = (r.avg * r.cnt + stars) / (r.cnt+1) - r.cnt += 1 - r.save! - end - end + def update_overall_average_rating(stars, dimension=nil) + if average(dimension).nil? + CachedRating.create do |r| + r.avg = stars + r.dimension = dimension + r.cacheable_id = self.id + r.cacheable_type = self.class.name + r.cnt = 1 + end + else + r = average(dimension) + r.avg = (r.avg * r.cnt + stars) / (r.cnt+1) + r.cnt += 1 + r.save! + end + end - def update_users_rating(stars, user_id, dimension=nil) - obj = rates(dimension).where(:rater_id => user_id).first - current_record = average(dimension) - current_record.avg = (current_record.avg*current_record.cnt - obj.stars + stars) / (current_record.cnt) - current_record.save! - obj.stars = stars - obj.save! - end + def update_users_rating(stars, user_id, dimension=nil) + obj = rates(dimension).where(:rater_id => user_id).first + current_record = average(dimension) + current_record.avg = (current_record.avg*current_record.cnt - obj.stars + stars) / (current_record.cnt) + current_record.save! + obj.stars = stars + obj.save! + end - def average(dimension=nil) - if dimension.nil? - self.send "rate_average_without_dimension" - else - self.send "#{dimension}_average" - end - end + def average(dimension=nil) + if dimension.nil? + self.send "rate_average_without_dimension" + else + self.send "#{dimension}_average" + end + end - def rates(dimension=nil) - if dimension.nil? - self.send "rates_without_dimension" - else - self.send "#{dimension}_rates" - end - end + def rates(dimension=nil) + if dimension.nil? + self.send "rates_without_dimension" + else + self.send "#{dimension}_rates" + end + end - def raters(dimension=nil) - if dimension.nil? - self.send "raters_without_dimension" - else - self.send "#{dimension}_raters" - end - end + def raters(dimension=nil) + if dimension.nil? + self.send "raters_without_dimension" + else + self.send "#{dimension}_raters" + end + end - def has_rated?(user_id, dimension=nil) - record = self.rates(dimension).where(:rater_id => user_id) - record.empty? ? false : true - end + def has_rated?(user_id, dimension=nil) + record = self.rates(dimension).where(:rater_id => user_id) + record.empty? ? false : true + end - def can_update? - self.class.can_update? - end + def can_update? + self.class.can_update? + end - module ClassMethods - def seems_rateable(opts={}) - #has_many :rates_without_dimension, -> { where(dimension: nil) }, :as => :rateable, :class_name => SeemsRateable::Rate, :dependent => :destroy - has_many :rates_without_dimension, :conditions => { dimension: nil }, :as => :rateable, :class_name => SeemsRateable::Rate, :dependent => :destroy - has_many :raters_without_dimension, :through => :rates_without_dimension, :source => :rater - has_one :rate_average_without_dimension, :conditions => { dimension: nil }, :as => :cacheable, :class_name => SeemsRateable::CachedRating, :dependent => :destroy - - @permission = opts[:allow_update] ? true : false - - def self.can_update? - @permission - end - - def self.rateable? - true - end - - if opts[:dimensions].is_a?(Array) - opts[:dimensions].each do |dimension| - has_many :"#{dimension}_rates", :conditions => { dimension: dimension.to_s }, :dependent => :destroy, :class_name => SeemsRateable::Rate, :as => :rateable - has_many :"#{dimension}_raters", :through => :"#{dimension}_rates", :source => :rater - has_one :"#{dimension}_average", :conditions => { dimension: dimension.to_s }, :as => :cacheable, :class_name => SeemsRateable::CachedRating, :dependent => :destroy - end - end - end - - def seems_rateable_rater - has_many :ratings_given, :class_name => SeemsRateable::Rate, :foreign_key => :rater_id - end - end - end + module ClassMethods + def seems_rateable(opts={}) + has_many :rates_without_dimension, -> { where(dimension: nil) }, :as => :rateable, :class_name => SeemsRateable::Rate, :dependent => :destroy + has_many :raters_without_dimension, :through => :rates_without_dimension, :source => :rater + has_one :rate_average_without_dimension, -> { where(dimension: nil) }, :as => :cacheable, :class_name => SeemsRateable::CachedRating, :dependent => :destroy + + @permission = opts[:allow_update] ? true : false + + def self.can_update? + @permission + end + + def self.rateable? + true + end + + if opts[:dimensions].is_a?(Array) + opts[:dimensions].each do |dimension| + has_many :"#{dimension}_rates", -> { where(dimension: dimension.to_s) }, :dependent => :destroy, :class_name => SeemsRateable::Rate, :as => :rateable + has_many :"#{dimension}_raters", :through => :"#{dimension}_rates", :source => :rater + has_one :"#{dimension}_average", -> { where(dimension: dimension.to_s) }, :as => :cacheable, :class_name => SeemsRateable::CachedRating, :dependent => :destroy + end + end + end + + def seems_rateable_rater + has_many :ratings_given, :class_name => SeemsRateable::Rate, :foreign_key => :rater_id + end + end + end end