Module: FastDestroyAll
- Extended by:
- ActiveSupport::Concern
- Included in:
- Ci::BuildTraceChunk, Deployment
- Defined in:
- app/models/concerns/fast_destroy_all.rb
Overview
This module is for replacing ‘dependent: :destroy` and `before_destroy` hooks.
In general, ‘destroy_all` is inefficient because it calls each callback with `DELETE` queries i.e. O(n), whereas, `delete_all` is efficient as it deletes all rows with a single `DELETE` query.
It’s better to use ‘delete_all` as our best practice, however, if external data (e.g. ObjectStorage, FileStorage or Redis) are associated with database records, it is difficult to accomplish it.
This module defines a format to use ‘delete_all` and delete associated external data. Here is an example
Situation
-
‘Project` has many `Ci::BuildTraceChunk` through `Ci::Build`
-
‘Ci::BuildTraceChunk` stores associated data in Redis, so it relies on `dependent: :destroy` and `before_destroy` for the deletion
How to use
-
Define ‘use_fast_destroy :build_trace_chunks` in `Project` model.
-
Define ‘begin_fast_destroy` and `finalize_fast_destroy(params)` in `Ci::BuildTraceChunk` model.
-
Use ‘fast_destroy_all` instead of `destroy` and `destroy_all`
-
Remove ‘dependent: :destroy` and `before_destroy` as it’s no longer need
Expectation
-
When a project is ‘destroy`ed, the associated trace_chunks will be deleted by `delete_all`, and the associated data will be removed, too.
-
When ‘fast_destroy_all` is called, it also performns as same.
Defined Under Namespace
Modules: Helpers
Constant Summary collapse
- ForbiddenActionError =
Class.new(StandardError)