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