Class: MeducationSDK::Recommender
- Inherits:
-
Object
- Object
- MeducationSDK::Recommender
show all
- Includes:
- Helpers
- Defined in:
- lib/meducation_sdk/services/recommender.rb
Defined Under Namespace
Classes: UserRecommender
Constant Summary
Constants included
from Helpers
Helpers::SDK_TO_SPI_MAPPINGS
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Methods included from Helpers
#sdk_class_for, #sdk_type_for, #spi_type_for
Constructor Details
#initialize(items, options = {}) ⇒ Recommender
Returns a new instance of Recommender.
14
15
16
17
18
|
# File 'lib/meducation_sdk/services/recommender.rb', line 14
def initialize(items, options = {})
@items = [items].flatten
@options = options
@limit = options[:limit] || 5
end
|
Instance Attribute Details
#items ⇒ Object
Returns the value of attribute items.
13
14
15
|
# File 'lib/meducation_sdk/services/recommender.rb', line 13
def items
@items
end
|
Class Method Details
.recommend(items, options = {}) ⇒ Object
5
6
7
8
9
10
11
|
# File 'lib/meducation_sdk/services/recommender.rb', line 5
def self.recommend(items, options = {})
if items.is_a?(User)
UserRecommender.new(items, options).recommend
else
new(items, options).recommend
end
end
|
Instance Method Details
#config ⇒ Object
87
88
89
|
# File 'lib/meducation_sdk/services/recommender.rb', line 87
def config
MeducationSDK.config
end
|
#generate_recommendations ⇒ Object
36
37
38
39
40
41
42
43
44
45
46
47
|
# File 'lib/meducation_sdk/services/recommender.rb', line 36
def generate_recommendations
groupings = {}
correct_order = recommender_results.map do |result|
groupings[result['type']] ||= []
groupings[result['type']] << result['id']
"#{result['type']}##{result['id']}"
end
output = groupings.map {|(type, ids)| sdk_class_for(type).where(id: ids) }.flatten
output.sort_by!{ |item| correct_order.index("#{item.class.name}##{item.id}") }
output
end
|
#log(*args) ⇒ Object
79
80
81
|
# File 'lib/meducation_sdk/services/recommender.rb', line 79
def log(*args)
config.logger.info(*args)
end
|
#log_error(*args) ⇒ Object
83
84
85
|
# File 'lib/meducation_sdk/services/recommender.rb', line 83
def log_error(*args)
config.logger.error(*args)
end
|
#recommend ⇒ Object
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
# File 'lib/meducation_sdk/services/recommender.rb', line 20
def recommend
recommendations = generate_recommendations
if recommendations.size < @limit
log "recommendations.size (#{recommendations.size}) is < limit of #{@limit}"
recommendations += MeducationSDK::MediaFile.where('rating > 2').where(safe_for_email: true).per(@limit - recommendations.size).order(:random).to_a
else
log "recommendations.size (#{recommendations.size}) is >= limit of #{@limit}"
end
recommendations
rescue => e
log_error("!!Recommender Error!!")
log_error(e.message)
log_error(e.backtrace)
MeducationSDK::MediaFile.where('rating > 2').where(safe_for_email: true).per(@limit).order(:random).to_a
end
|
#recommender_json ⇒ Object
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
# File 'lib/meducation_sdk/services/recommender.rb', line 60
def recommender_json
path = "/combined"
separator = "?"
@items.each do |item|
item_type, item_id = if item.is_a?(BoardItem)
[item.item_type, item.item_id]
else
[item.class.name, item.id]
end
path << separator << "#{spi_type_for(item_type)}/#{item_id}"
separator = "&"
end
log "Calling #{config.recommender_host}:#{config.recommender_host}#{path}"
response = Net::HTTP.get_response(config.recommender_host, path, config.recommender_port)
body = response.body
log "Received #{body}"
body
end
|
#recommender_results ⇒ Object
49
50
51
52
53
54
55
56
57
58
|
# File 'lib/meducation_sdk/services/recommender.rb', line 49
def recommender_results
@recommender_results ||= begin
results = JSON.parse(recommender_json)
if @options[:limit]
results[0..(@options[:limit] - 1)]
else
results
end
end
end
|