Module: SeemsRateable::Model

Extended by:
ActiveSupport::Concern
Defined in:
lib/seems_rateable/model.rb

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Instance Method Details

#average(dimension = nil) ⇒ Object



49
50
51
52
53
54
55
# File 'lib/seems_rateable/model.rb', line 49

def average(dimension=nil)
  if dimension.nil?
    self.send "rate_average_without_dimension"
  else
    self.send "#{dimension}_average"
  end
end

#can_update?Boolean

Returns:

  • (Boolean)


78
79
80
# File 'lib/seems_rateable/model.rb', line 78

def can_update?
  self.class.can_update?
end

#has_rated?(user_id, dimension = nil) ⇒ Boolean

Returns:

  • (Boolean)


73
74
75
76
# File 'lib/seems_rateable/model.rb', line 73

def has_rated?(user_id, dimension=nil)
  record = self.rates(dimension).where(:rater_id => user_id)
  record.empty? ? false : true        
end

#rate(stars, user_id, dimension = nil) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/seems_rateable/model.rb', line 7

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

#raters(dimension = nil) ⇒ Object



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

def raters(dimension=nil)
  if dimension.nil?
    self.send "raters_without_dimension"
  else
    self.send "#{dimension}_raters"
  end
end

#rates(dimension = nil) ⇒ Object



57
58
59
60
61
62
63
# File 'lib/seems_rateable/model.rb', line 57

def rates(dimension=nil)
  if dimension.nil?
    self.send "rates_without_dimension"
  else
    self.send "#{dimension}_rates"
  end
end

#update_overall_average_rating(stars, dimension = nil) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/seems_rateable/model.rb', line 22

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

#update_users_rating(stars, user_id, dimension = nil) ⇒ Object



39
40
41
42
43
44
45
46
# File 'lib/seems_rateable/model.rb', line 39

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