Commit 5fba93dd04f1840c1834130276f24c6cb6002579
1 parent
1df3b980
Exists in
master
and in
29 other branches
person: register and use friends_count to fetch most_popular people
(ActionItem3039)
Showing
5 changed files
with
70 additions
and
12 deletions
Show diff stats
app/models/friendship.rb
1 | 1 | class Friendship < ActiveRecord::Base |
2 | 2 | track_actions :new_friendship, :after_create, :keep_params => ["friend.name", "friend.url", "friend.profile_custom_icon"], :custom_user => :person |
3 | - | |
3 | + | |
4 | + extend CacheCounterHelper | |
5 | + | |
4 | 6 | belongs_to :person, :foreign_key => :person_id |
5 | 7 | belongs_to :friend, :class_name => 'Person', :foreign_key => 'friend_id' |
8 | + | |
9 | + after_create do |friendship| | |
10 | + update_cache_counter(:friends_count, friendship.person, 1) | |
11 | + update_cache_counter(:friends_count, friendship.friend, 1) | |
12 | + end | |
13 | + | |
14 | + after_destroy do |friendship| | |
15 | + update_cache_counter(:friends_count, friendship.person, -1) | |
16 | + update_cache_counter(:friends_count, friendship.friend, -1) | |
17 | + end | |
6 | 18 | end | ... | ... |
app/models/person.rb
... | ... | @@ -66,11 +66,7 @@ class Person < Profile |
66 | 66 | has_and_belongs_to_many :acepted_forums, :class_name => 'Forum', :join_table => 'terms_forum_people' |
67 | 67 | has_and_belongs_to_many :articles_with_access, :class_name => 'Article', :join_table => 'article_privacy_exceptions' |
68 | 68 | |
69 | - named_scope :more_popular, | |
70 | - :select => "#{Profile.qualified_column_names}, count(friend_id) as total", | |
71 | - :group => Profile.qualified_column_names, | |
72 | - :joins => "LEFT OUTER JOIN friendships on profiles.id = friendships.person_id", | |
73 | - :order => "total DESC" | |
69 | + named_scope :more_popular, :order => 'friends_count DESC' | |
74 | 70 | |
75 | 71 | named_scope :more_active, |
76 | 72 | :select => "#{Profile.qualified_column_names}, count(action_tracker.id) as total", | ... | ... |
db/migrate/20140312144156_define_initial_value_for_profiles_friends_count.rb
0 → 100644
... | ... | @@ -0,0 +1,12 @@ |
1 | +class DefineInitialValueForProfilesFriendsCount < ActiveRecord::Migration | |
2 | + def self.up | |
3 | + friends_counts = execute("SELECT profiles.id, count(profiles.id) FROM profiles INNER JOIN friendships ON ( profiles.id = friendships.friend_id AND profiles.type = E'Person') GROUP BY profiles.id;") | |
4 | + friends_counts.each do |count| | |
5 | + execute("UPDATE profiles SET friends_count=#{count['count'].to_i} WHERE profiles.id=#{count['id']};") | |
6 | + end | |
7 | + end | |
8 | + | |
9 | + def self.down | |
10 | + execute("UPDATE profiles SET friends_count=0;") | |
11 | + end | |
12 | +end | ... | ... |
test/unit/person_test.rb
... | ... | @@ -647,11 +647,14 @@ class PersonTest < ActiveSupport::TestCase |
647 | 647 | p2 = fast_create(Person) |
648 | 648 | p3 = fast_create(Person) |
649 | 649 | |
650 | - p1.add_friend(p2) | |
651 | - p2.add_friend(p1) | |
652 | - p2.add_friend(p3) | |
653 | - assert_equal p2, Person.more_popular[0] | |
654 | - assert_equal p1, Person.more_popular[1] | |
650 | + p1.friends_count = 1 | |
651 | + p2.friends_count = 2 | |
652 | + p3.friends_count = 3 | |
653 | + p1.save! | |
654 | + p2.save! | |
655 | + p3.save! | |
656 | + | |
657 | + assert_order [p3, p2, p1], Person.more_popular | |
655 | 658 | end |
656 | 659 | |
657 | 660 | should 'list people that have no friends in more popular list' do |
... | ... | @@ -1363,7 +1366,7 @@ class PersonTest < ActiveSupport::TestCase |
1363 | 1366 | u = create_user('user'+i.to_s) |
1364 | 1367 | u.deactivate |
1365 | 1368 | } |
1366 | - assert_equal activated, Person.activated | |
1369 | + assert_equivalent activated, Person.activated | |
1367 | 1370 | end |
1368 | 1371 | |
1369 | 1372 | should 'deactivated named_scope return persons who are deactivated users' do |
... | ... | @@ -1413,4 +1416,31 @@ class PersonTest < ActiveSupport::TestCase |
1413 | 1416 | person.reload |
1414 | 1417 | assert_equal person.activities, [] |
1415 | 1418 | end |
1419 | + | |
1420 | + should 'increase friends_count on new friendship' do | |
1421 | + person = create_user('person').person | |
1422 | + friend = create_user('friend').person | |
1423 | + assert_difference person, :friends_count, 1 do | |
1424 | + assert_difference friend, :friends_count, 1 do | |
1425 | + person.add_friend(friend) | |
1426 | + friend.reload | |
1427 | + end | |
1428 | + person.reload | |
1429 | + end | |
1430 | + end | |
1431 | + | |
1432 | + should 'decrease friends_count on new friendship' do | |
1433 | + person = create_user('person').person | |
1434 | + friend = create_user('friend').person | |
1435 | + person.add_friend(friend) | |
1436 | + friend.reload | |
1437 | + person.reload | |
1438 | + assert_difference person, :friends_count, -1 do | |
1439 | + assert_difference friend, :friends_count, -1 do | |
1440 | + person.remove_friend(friend) | |
1441 | + friend.reload | |
1442 | + end | |
1443 | + person.reload | |
1444 | + end | |
1445 | + end | |
1416 | 1446 | end | ... | ... |