group member count optimization

This commit is contained in:
2458773093 2019-07-22 03:46:00 +03:00
parent bd3f453c0d
commit bf2d54201b
7 changed files with 45 additions and 5 deletions

@ -15,6 +15,7 @@
# is_archived :boolean default(FALSE), not null
# created_at :datetime not null
# updated_at :datetime not null
# member_count :integer default(0)
#
class Group < ApplicationRecord

@ -21,10 +21,20 @@ class GroupAccount < ApplicationRecord
validates :account_id, uniqueness: { scope: :group_id }
after_commit :remove_relationship_cache
after_create :increment_member_count
after_destroy :decrement_member_count
private
def remove_relationship_cache
Rails.cache.delete("relationship:#{account_id}:group#{group_id}")
end
def increment_member_count
group&.increment!(:member_count)
end
def decrement_member_count
group&.decrement!(:member_count)
end
end

@ -22,8 +22,4 @@ class REST::GroupSerializer < ActiveModel::Serializer
full_asset_url(object.cover_image.url)
end
def member_count
object.accounts.count
end
end

@ -0,0 +1,10 @@
class AddMemberCountToGroups < ActiveRecord::Migration[5.2]
def up
add_column :groups, :member_count, :integer
change_column_default :groups, :member_count, 0
end
def down
remove_column :groups, :member_count
end
end

@ -0,0 +1,10 @@
class BackfillAddMemberCountToGroups < ActiveRecord::Migration[5.2]
disable_ddl_transaction!
def change
Group.in_batches do |relation|
relation.update_all member_count: 0
sleep(0.1)
end
end
end

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 2019_07_21_234917) do
ActiveRecord::Schema.define(version: 2019_07_22_003649) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@ -358,6 +358,7 @@ ActiveRecord::Schema.define(version: 2019_07_21_234917) do
t.boolean "is_archived", default: false, null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "member_count", default: 0
t.index ["account_id"], name: "index_groups_on_account_id"
end

@ -0,0 +1,12 @@
# frozen_string_literal: true
task fix_group_member_counts: 'gabsocial:fix-group-member-counts'
namespace :gabsocial do
desc 'Re-compute group member counts'
task :fix_group_member_counts => :environment do
Group.select(:id).all.each do |group|
group.update_column(:member_count, group.accounts.count)
end
end
end