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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
# File 'lib/recommendable/acts_as_recommended_to.rb', line 14
def acts_as_recommended_to
class_eval do
Recommendable.user_class = self
has_many :likes, :class_name => "Recommendable::Like", :dependent => :destroy, :foreign_key => :user_id
has_many :dislikes, :class_name => "Recommendable::Dislike", :dependent => :destroy, :foreign_key => :user_id
has_many :ignores, :class_name => "Recommendable::Ignore", :dependent => :destroy, :foreign_key => :user_id
has_many :stashed_items, :class_name => "Recommendable::Stash", :dependent => :destroy, :foreign_key => :user_id
include LikeMethods
include DislikeMethods
include StashMethods
include IgnoreMethods
include RecommendationMethods
include Hooks
before_destroy :remove_from_similarities, :remove_recommendations
define_hook :before_like
define_hook :after_like
define_hook :before_unlike
define_hook :after_unlike
define_hook :before_dislike
define_hook :after_dislike
define_hook :before_undislike
define_hook :after_undislike
define_hook :before_stash
define_hook :after_stash
define_hook :before_unstash
define_hook :after_unstash
define_hook :before_ignore
define_hook :after_ignore
define_hook :before_unignore
define_hook :after_unignore
%w(like dislike ignore).each do |action|
send "before_#{action}", lambda { |obj| completely_unrecommend obj }
end
%w(like unlike dislike undislike).each do |action|
send "after_#{action}", lambda { |obj|
obj.send(:update_score)
obj.send "update_#{action.gsub('un', '')}_count"
Recommendable.enqueue(self.id)
}
end
before_stash { |obj| unignore(obj) and unpredict(obj) }
def method_missing method, *args, &block
if method.to_s =~ /^(liked|disliked)_(.+)_in_common_with$/
begin
super unless $2.classify.constantize.acts_as_recommendable?
self.send "#{$1}_in_common_with", *args, { :class => $2.classify.constantize }
rescue NameError
super
end
elsif method.to_s =~ /^(liked|disliked|ignored|stashed|recommended)_(.+)$/
begin
super unless $2.classify.constantize.acts_as_recommendable?
self.send "#{$1}_for", $2.classify.constantize, *args
rescue NameError
super
end
else
super
end
end
def respond_to? method, include_private = false
if method.to_s =~ /^(liked|disliked|ignored|stashed|recommended)_(.+)$/ || method.to_s =~ /^common_(liked|disliked)_(.+)_with$/
begin
$2.classify.constantize.acts_as_recommendable?
rescue NameError
false
end
else
super
end
end
private :likes, :dislikes, :ignores, :stashed_items
end
end
|