Commit d8fd6277689d5f91c826e2374ccc968aa8211af8
1 parent
e7df3c52
Exists in
master
and in
29 other branches
checkpoint
Showing
4 changed files
with
51 additions
and
15 deletions
Show diff stats
app/models/profile_suggestion.rb
@@ -66,8 +66,16 @@ class ProfileSuggestion < ActiveRecord::Base | @@ -66,8 +66,16 @@ class ProfileSuggestion < ActiveRecord::Base | ||
66 | # Number of communities in common | 66 | # Number of communities in common |
67 | COMMON_COMMUNITIES = 2 | 67 | COMMON_COMMUNITIES = 2 |
68 | 68 | ||
69 | - # Number of friends in common | ||
70 | - COMMON_TAGS = 2 | 69 | + # Number of tags in common |
70 | + COMMON_TAGS = 5 | ||
71 | + | ||
72 | + def self.connections(rule) | ||
73 | + rule.split(/.*_with_/).last + '_connections' | ||
74 | + end | ||
75 | + | ||
76 | + def self.counter(rule) | ||
77 | + rule.split(/.*_with_/).last + '_count' | ||
78 | + end | ||
71 | 79 | ||
72 | def self.register_suggestions(person, suggested_profiles, rule) | 80 | def self.register_suggestions(person, suggested_profiles, rule) |
73 | return if suggested_profiles.nil? | 81 | return if suggested_profiles.nil? |
@@ -75,10 +83,9 @@ class ProfileSuggestion < ActiveRecord::Base | @@ -75,10 +83,9 @@ class ProfileSuggestion < ActiveRecord::Base | ||
75 | suggested_profiles = suggested_profiles.where("profiles.id NOT IN (#{already_suggested_profiles})") if already_suggested_profiles.present? | 83 | suggested_profiles = suggested_profiles.where("profiles.id NOT IN (#{already_suggested_profiles})") if already_suggested_profiles.present? |
76 | suggested_profiles = suggested_profiles.limit(SUGGESTIONS_BY_RULE) | 84 | suggested_profiles = suggested_profiles.limit(SUGGESTIONS_BY_RULE) |
77 | return if suggested_profiles.blank? | 85 | return if suggested_profiles.blank? |
78 | - counter = rule.split(/.*_with_/).last | ||
79 | suggested_profiles.each do |suggested_profile| | 86 | suggested_profiles.each do |suggested_profile| |
80 | suggestion = person.profile_suggestions.find_or_initialize_by_suggestion_id(suggested_profile.id) | 87 | suggestion = person.profile_suggestions.find_or_initialize_by_suggestion_id(suggested_profile.id) |
81 | - suggestion.send(counter+'=', suggested_profile.common_count.to_i) | 88 | + suggestion.send(counter(rule)+'=', suggested_profile.common_count.to_i) |
82 | suggestion.save! | 89 | suggestion.save! |
83 | end | 90 | end |
84 | end | 91 | end |
@@ -95,18 +102,43 @@ class ProfileSuggestion < ActiveRecord::Base | @@ -95,18 +102,43 @@ class ProfileSuggestion < ActiveRecord::Base | ||
95 | # need here. | 102 | # need here. |
96 | 103 | ||
97 | def self.people_with_common_friends(person) | 104 | def self.people_with_common_friends(person) |
98 | - person_friends = person.friends.map(&:id) | ||
99 | - return if person_friends.blank? | ||
100 | - person.environment.people. | ||
101 | - select("profiles.*, suggestions.count AS common_count"). | ||
102 | - joins(" | ||
103 | - INNER JOIN (SELECT person_id, count(person_id) FROM | 105 | + "SELECT person_id as profiles_id, array_agg(friend_id) as common_friends_connections, count(person_id) as common_friends_count FROM |
104 | friendships WHERE friend_id IN (#{person_friends.join(',')}) AND | 106 | friendships WHERE friend_id IN (#{person_friends.join(',')}) AND |
105 | person_id NOT IN (#{(person_friends << person.id).join(',')}) | 107 | person_id NOT IN (#{(person_friends << person.id).join(',')}) |
106 | GROUP BY person_id | 108 | GROUP BY person_id |
107 | - HAVING count(person_id) >= #{COMMON_FRIENDS}) AS suggestions | ||
108 | - ON profiles.id = suggestions.person_id") | ||
109 | - end | 109 | + HAVING count(person_id) >= #{COMMON_FRIENDS}" |
110 | + end | ||
111 | + | ||
112 | + def self.all_suggestions(person) | ||
113 | + select_string = "profiles.*, " + RULES.map { rule| "suggestions.#{counter(rule)} as #{counter(rule)}, suggestions.#{connections(rule)} as #{connections(rule)}" }.join(',') | ||
114 | + suggestions_join = RULES.map.with_index do |rule, i| | ||
115 | + if i == 0 | ||
116 | + "(#{self.send(rule, person)}) AS #{rule}" | ||
117 | + else | ||
118 | + previous_rule = RULES[i-1] | ||
119 | + "LEFT OUTER JOIN (#{self.send(rule, person)}) AS #{rule} ON #{previous_rule}.profiles_id = #{rule}.profiles_id" | ||
120 | + end | ||
121 | + end.join(' ') | ||
122 | + join_string = "INNER JOIN (SELECT * FROM #{suggestions_join}) AS suggestions ON profiles.id = suggestions.profiles_id" | ||
123 | + person.environment.profiles. | ||
124 | + select(select_string). | ||
125 | + joins(join_string) | ||
126 | + | ||
127 | + end | ||
128 | + | ||
129 | +# def self.people_with_common_friends(person) | ||
130 | +# person_friends = person.friends.map(&:id) | ||
131 | +# return if person_friends.blank? | ||
132 | +# person.environment.people. | ||
133 | +# select("profiles.*, suggestions.count as common_count, suggestions.array_agg as connections"). | ||
134 | +# joins(" | ||
135 | +# INNER JOIN (SELECT person_id, array_agg(friend_id), count(person_id) FROM | ||
136 | +# friendships WHERE friend_id IN (#{person_friends.join(',')}) AND | ||
137 | +# person_id NOT IN (#{(person_friends << person.id).join(',')}) | ||
138 | +# GROUP BY person_id | ||
139 | +# HAVING count(person_id) >= #{COMMON_FRIENDS}) AS suggestions | ||
140 | +# ON profiles.id = suggestions.person_id") | ||
141 | +# end | ||
110 | 142 | ||
111 | def self.people_with_common_communities(person) | 143 | def self.people_with_common_communities(person) |
112 | person_communities = person.communities.map(&:id) | 144 | person_communities = person.communities.map(&:id) |
app/views/profile/_upload_image.html.erb
@@ -10,5 +10,5 @@ | @@ -10,5 +10,5 @@ | ||
10 | </div> | 10 | </div> |
11 | </div> | 11 | </div> |
12 | </div> | 12 | </div> |
13 | -<div title='<%= activity.target.class.short_description %>' class='profile-activity-icon icon-new icon-newgallery'></div> | 13 | +<div title='<%#= activity.target.class.short_description %>' class='profile-activity-icon icon-new icon-newgallery'></div> |
14 | <br/> | 14 | <br/> |
db/migrate/20140720144212_create_profile_suggestions.rb
@@ -6,10 +6,12 @@ class CreateProfileSuggestions < ActiveRecord::Migration | @@ -6,10 +6,12 @@ class CreateProfileSuggestions < ActiveRecord::Migration | ||
6 | t.string :suggestion_type | 6 | t.string :suggestion_type |
7 | t.text :categories | 7 | t.text :categories |
8 | t.boolean :enabled, :default => true | 8 | t.boolean :enabled, :default => true |
9 | + t.float :score | ||
9 | 10 | ||
10 | t.timestamps | 11 | t.timestamps |
11 | end | 12 | end |
12 | add_index :profile_suggestions, :person_id | 13 | add_index :profile_suggestions, :person_id |
13 | add_index :profile_suggestions, :suggestion_id | 14 | add_index :profile_suggestions, :suggestion_id |
15 | + add_index :profile_suggestions, :score | ||
14 | end | 16 | end |
15 | end | 17 | end |
db/schema.rb
@@ -11,7 +11,7 @@ | @@ -11,7 +11,7 @@ | ||
11 | # | 11 | # |
12 | # It's strongly recommended to check this file into your version control system. | 12 | # It's strongly recommended to check this file into your version control system. |
13 | 13 | ||
14 | -ActiveRecord::Schema.define(:version => 20140720144212) do | 14 | +ActiveRecord::Schema.define(:version => 20140805205626) do |
15 | 15 | ||
16 | create_table "abuse_reports", :force => true do |t| | 16 | create_table "abuse_reports", :force => true do |t| |
17 | t.integer "reporter_id" | 17 | t.integer "reporter_id" |
@@ -452,11 +452,13 @@ ActiveRecord::Schema.define(:version => 20140720144212) do | @@ -452,11 +452,13 @@ ActiveRecord::Schema.define(:version => 20140720144212) do | ||
452 | t.string "suggestion_type" | 452 | t.string "suggestion_type" |
453 | t.text "categories" | 453 | t.text "categories" |
454 | t.boolean "enabled", :default => true | 454 | t.boolean "enabled", :default => true |
455 | + t.float "score" | ||
455 | t.datetime "created_at", :null => false | 456 | t.datetime "created_at", :null => false |
456 | t.datetime "updated_at", :null => false | 457 | t.datetime "updated_at", :null => false |
457 | end | 458 | end |
458 | 459 | ||
459 | add_index "profile_suggestions", ["person_id"], :name => "index_profile_suggestions_on_person_id" | 460 | add_index "profile_suggestions", ["person_id"], :name => "index_profile_suggestions_on_person_id" |
461 | + add_index "profile_suggestions", ["score"], :name => "index_profile_suggestions_on_score" | ||
460 | add_index "profile_suggestions", ["suggestion_id"], :name => "index_profile_suggestions_on_suggestion_id" | 462 | add_index "profile_suggestions", ["suggestion_id"], :name => "index_profile_suggestions_on_suggestion_id" |
461 | 463 | ||
462 | create_table "profiles", :force => true do |t| | 464 | create_table "profiles", :force => true do |t| |