commit: 74c8ca699c37ebdb0e3c6f0648f9f90a4f1f8f89
parent: eddb95b0126e523faeafbde544ff5df3a64e5b25
Author: alpaca-tc <alpaca-tc@alpaca.tc>
Date: Fri, 5 May 2017 06:44:39 +0900
Delete records in smaller transaction (#2802)
Diffstat:
3 files changed, 50 insertions(+), 8 deletions(-)
diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb
@@ -17,12 +17,16 @@ class SuspendAccountService < BaseService
RemoveStatusService.new.call(status)
end
- @account.media_attachments.destroy_all
- @account.stream_entries.destroy_all
- @account.notifications.destroy_all
- @account.favourites.destroy_all
- @account.active_relationships.destroy_all
- @account.passive_relationships.destroy_all
+ [
+ @account.media_attachments,
+ @account.stream_entries,
+ @account.notifications,
+ @account.favourites,
+ @account.active_relationships,
+ @account.passive_relationships
+ ].each do |association|
+ destroy_all(association)
+ end
end
def purge_profile
@@ -35,6 +39,10 @@ class SuspendAccountService < BaseService
end
def unsubscribe_push_subscribers
- @account.subscriptions.destroy_all
+ destroy_all(@account.subscriptions)
+ end
+
+ def destroy_all(association)
+ association.in_batches.destroy_all
end
end
diff --git a/spec/fabricators/favourite_fabricator.rb b/spec/fabricators/favourite_fabricator.rb
@@ -1,3 +1,4 @@
Fabricator(:favourite) do
-
+ account
+ status
end
diff --git a/spec/services/suspend_account_service_spec.rb b/spec/services/suspend_account_service_spec.rb
@@ -0,0 +1,33 @@
+require 'rails_helper'
+
+RSpec.describe SuspendAccountService do
+ describe '#call' do
+ subject do
+ -> { described_class.new.call(account) }
+ end
+
+ let!(:account) { Fabricate(:account) }
+ let!(:status) { Fabricate(:status, account: account) }
+ let!(:media_attachment) { Fabricate(:media_attachment, account: account) }
+ let!(:notification) { Fabricate(:notification, account: account) }
+ let!(:favourite) { Fabricate(:favourite, account: account) }
+ let!(:active_relationship) { Fabricate(:follow, account: account) }
+ let!(:passive_relationship) { Fabricate(:follow, target_account: account) }
+ let!(:subscription) { Fabricate(:subscription, account: account) }
+
+ it 'deletes associated records' do
+ is_expected.to change {
+ [
+ account.statuses,
+ account.media_attachments,
+ account.stream_entries,
+ account.notifications,
+ account.favourites,
+ account.active_relationships,
+ account.passive_relationships,
+ account.subscriptions
+ ].map(&:count)
+ }.from([1, 1, 1, 1, 1, 1, 1, 1]).to([0, 0, 0, 0, 0, 0, 0, 0])
+ end
+ end
+end