diff options
author | Jan Provaznik <jprovaznik@gitlab.com> | 2018-12-04 22:48:21 +0300 |
---|---|---|
committer | Jan Provaznik <jprovaznik@gitlab.com> | 2018-12-07 00:00:19 +0300 |
commit | 9ccf8d032ff82841cdfe96e2abe4b1d317058244 (patch) | |
tree | 979a29a1ed7bc6cab4efb578d2b34daafe70f38e /app/models/concerns/with_uploads.rb | |
parent | 239fdc78b1ced1861cdcf00b8927963e30ef2095 (diff) |
Enabled feature flag for fast deletions
Fast destroy is used only if the feature flag is enabled, otherwise
uploads are still deleted using carrier wave. It's disabled by default.
Diffstat (limited to 'app/models/concerns/with_uploads.rb')
-rw-r--r-- | app/models/concerns/with_uploads.rb | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/app/models/concerns/with_uploads.rb b/app/models/concerns/with_uploads.rb index 50a9b19299a..761b40893b4 100644 --- a/app/models/concerns/with_uploads.rb +++ b/app/models/concerns/with_uploads.rb @@ -18,6 +18,7 @@ module WithUploads extend ActiveSupport::Concern include FastDestroyAll::Helpers + include FeatureGate # Currently there is no simple way how to select only not-mounted # uploads, it should be all FileUploaders so we select them by @@ -26,12 +27,44 @@ module WithUploads included do has_many :uploads, as: :model - has_many :file_uploads, -> { where(uploader: FILE_UPLOADERS) }, class_name: 'Upload', as: :model, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent + has_many :file_uploads, -> { where(uploader: FILE_UPLOADERS) }, class_name: 'Upload', as: :model + + # TODO: when feature flag is removed, we can use just dependent: destroy + # option on :file_uploads + before_destroy :remove_file_uploads use_fast_destroy :file_uploads end + def perform_fast_destroy(subject) + super if fast_destroy_enabled? + end + def retrieve_upload(_identifier, paths) uploads.find_by(path: paths) end + + private + + # mounted uploads are deleted in carrierwave's after_commit hook, + # but FileUploaders which are not mounted must be deleted explicitly and + # it can not be done in after_commit because FileUploader requires loads + # associated model on destroy (which is already deleted in after_commit) + def remove_file_uploads + fast_destroy_enabled? ? delete_uploads : destroy_uploads + end + + def delete_uploads + file_uploads.delete_all(:delete_all) + end + + def destroy_uploads + file_uploads.find_each do |upload| + upload.destroy + end + end + + def fast_destroy_enabled? + Feature.enabled?(:fast_destroy_uploads, self) + end end |