Commit d8fd6277689d5f91c826e2374ccc968aa8211af8
1 parent
e7df3c52
Exists in
master
and in
27 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 | 66 | # Number of communities in common |
| 67 | 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 | 80 | def self.register_suggestions(person, suggested_profiles, rule) |
| 73 | 81 | return if suggested_profiles.nil? |
| ... | ... | @@ -75,10 +83,9 @@ class ProfileSuggestion < ActiveRecord::Base |
| 75 | 83 | suggested_profiles = suggested_profiles.where("profiles.id NOT IN (#{already_suggested_profiles})") if already_suggested_profiles.present? |
| 76 | 84 | suggested_profiles = suggested_profiles.limit(SUGGESTIONS_BY_RULE) |
| 77 | 85 | return if suggested_profiles.blank? |
| 78 | - counter = rule.split(/.*_with_/).last | |
| 79 | 86 | suggested_profiles.each do |suggested_profile| |
| 80 | 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 | 89 | suggestion.save! |
| 83 | 90 | end |
| 84 | 91 | end |
| ... | ... | @@ -95,18 +102,43 @@ class ProfileSuggestion < ActiveRecord::Base |
| 95 | 102 | # need here. |
| 96 | 103 | |
| 97 | 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 | 106 | friendships WHERE friend_id IN (#{person_friends.join(',')}) AND |
| 105 | 107 | person_id NOT IN (#{(person_friends << person.id).join(',')}) |
| 106 | 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 | 143 | def self.people_with_common_communities(person) |
| 112 | 144 | person_communities = person.communities.map(&:id) | ... | ... |
app/views/profile/_upload_image.html.erb
| ... | ... | @@ -10,5 +10,5 @@ |
| 10 | 10 | </div> |
| 11 | 11 | </div> |
| 12 | 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 | 14 | <br/> | ... | ... |
db/migrate/20140720144212_create_profile_suggestions.rb
| ... | ... | @@ -6,10 +6,12 @@ class CreateProfileSuggestions < ActiveRecord::Migration |
| 6 | 6 | t.string :suggestion_type |
| 7 | 7 | t.text :categories |
| 8 | 8 | t.boolean :enabled, :default => true |
| 9 | + t.float :score | |
| 9 | 10 | |
| 10 | 11 | t.timestamps |
| 11 | 12 | end |
| 12 | 13 | add_index :profile_suggestions, :person_id |
| 13 | 14 | add_index :profile_suggestions, :suggestion_id |
| 15 | + add_index :profile_suggestions, :score | |
| 14 | 16 | end |
| 15 | 17 | end | ... | ... |
db/schema.rb
| ... | ... | @@ -11,7 +11,7 @@ |
| 11 | 11 | # |
| 12 | 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 | 16 | create_table "abuse_reports", :force => true do |t| |
| 17 | 17 | t.integer "reporter_id" |
| ... | ... | @@ -452,11 +452,13 @@ ActiveRecord::Schema.define(:version => 20140720144212) do |
| 452 | 452 | t.string "suggestion_type" |
| 453 | 453 | t.text "categories" |
| 454 | 454 | t.boolean "enabled", :default => true |
| 455 | + t.float "score" | |
| 455 | 456 | t.datetime "created_at", :null => false |
| 456 | 457 | t.datetime "updated_at", :null => false |
| 457 | 458 | end |
| 458 | 459 | |
| 459 | 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 | 462 | add_index "profile_suggestions", ["suggestion_id"], :name => "index_profile_suggestions_on_suggestion_id" |
| 461 | 463 | |
| 462 | 464 | create_table "profiles", :force => true do |t| | ... | ... |