point_rules.rb
2.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# Be sure to restart your server when you modify this file.
#
# Points are a simple integer value which are given to "meritable" resources
# according to rules in +app/models/merit/point_rules.rb+. They are given on
# actions-triggered, either to the action user or to the method (or array of
# methods) defined in the +:to+ option.
#
# 'score' method may accept a block which evaluates to boolean
# (recieves the object as parameter)
module Merit
class PointRules
include Merit::PointRulesMethods
AVAILABLE_RULES = {
:comment_author => {
:action => 'comment#create',
:undo_action => 'comment#destroy',
:to => :author,
:value => 1,
:default_weight => 10
},
:article_author => {
:action => 'article#create',
:undo_action => 'article#destroy',
:to => :author,
:value => 1,
:default_weight => 50
},
:vote_voteable_author => {
:action => 'vote#create',
:undo_action => 'vote#destroy',
:to => lambda {|vote| vote.voteable.author},
:profile => lambda {|vote| vote.voteable.profile},
:value => lambda {|vote| vote.vote},
:default_weight => 5
},
:vote_voteable => {
:action => 'vote#create',
:undo_action => 'vote#destroy',
:to => lambda {|vote| vote.voteable},
:profile => lambda {|vote| vote.voteable.profile},
:value => lambda {|vote| vote.vote},
:default_weight => 5
},
}
# FIXME get value from environment
def weight(category)
AVAILABLE_RULES[category][:default_weight]
end
def calculate_score(target, category, value)
value = value.call(target) if value.respond_to?(:call)
weight(category) * value
end
# TODO receive environment parameter
def initialize
AVAILABLE_RULES.each do |category, setting|
[setting[:action], setting[:undo_action]].compact.zip([1, -1]).each do |action, signal|
score lambda {|target| signal * calculate_score(target, category, setting[:value])}, :on => action, :to => setting[:to], :category => category
end
end
end
end
end