-
-
Notifications
You must be signed in to change notification settings - Fork 365
/
experiment.rb
59 lines (50 loc) · 1.34 KB
/
experiment.rb
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
module Split
class Experiment
attr_accessor :name
attr_accessor :alternatives
attr_accessor :winner
def initialize(name, *alternatives)
@name = name.to_s
@alternatives = alternatives
end
def winner
if w = Split.redis.hget(:experiment_winner, name)
return Split::Alternative.find(w, name)
else
nil
end
end
def winner=(winner_name)
Split.redis.hset(:experiment_winner, name, winner_name.to_s)
end
def alternatives
@alternatives.map {|a| Split::Alternative.find_or_create(a, name)}
end
def next_alternative
winner || alternatives.sort_by{|a| a.participant_count + rand}.first
end
def save
Split.redis.sadd(:experiments, name)
@alternatives.each {|a| Split.redis.sadd(name, a) }
end
def self.all
Array(Split.redis.smembers(:experiments)).map {|e| find(e)}
end
def self.find(name)
if Split.redis.exists(name)
self.new(name, *Split.redis.smembers(name))
else
raise 'Experiment not found'
end
end
def self.find_or_create(name, *alternatives)
if Split.redis.exists(name)
return self.new(name, *Split.redis.smembers(name))
else
experiment = self.new(name, *alternatives)
experiment.save
return experiment
end
end
end
end