rails_delete_all_and_assocs_without_instantiation 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9acdcdfc546fa1f49d03d2f52f785e8a012211cb2fead2ff5dad11767d125cc
|
4
|
+
data.tar.gz: e46db80ef699f7ad8a8ffbd4f9689f15c019826ad65acdbbd1d982cdaa423a52
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 87cdde62744d43c2567d6b55a59ccddcd0a412925c6d396294396839d12036dab633d3a3fd09d3284952bd5a351d4467c27d0426e5cf088b92b83963860f284c
|
7
|
+
data.tar.gz: 19ac4b45404cd36e02d1f1aac7cf8a9598a862ae272e32553258a377dbf2af8aa28ffc7047aa6e817898ab32fbb8922180b4b48bd5009d4243365fbb30187354
|
data/README.md
CHANGED
@@ -36,3 +36,22 @@ class User < ApplicationRecord
|
|
36
36
|
has_many :creator_accounts, -> (user_id) { where(creator_id: user_id) }, dependent: :destroy
|
37
37
|
end
|
38
38
|
```
|
39
|
+
|
40
|
+
# Customization
|
41
|
+
```
|
42
|
+
class User
|
43
|
+
# This is a way you can do more advanced filtering on association dependencies, and not just wipe everything
|
44
|
+
def self.delete_all_and_assocs_without_instantiation_builder models_and_ids_list = {}, errors = [], options = {}
|
45
|
+
original_account_ids = models_and_ids_list['Account']
|
46
|
+
models_and_ids_list, errors = super(models_and_ids_list, errors, options)
|
47
|
+
# we've ignored the deletion command that may or may not have been created by your assoc definition
|
48
|
+
models_and_ids_list['Account'] = original_account_ids
|
49
|
+
|
50
|
+
query = self.where({}).includes(:accounts).joins(:accounts).where(accounts: {marketable: true})
|
51
|
+
account_ids = query.collect{|pro| pro.accounts.map(&:id) }.flatten
|
52
|
+
models_and_ids_list, errors = Account.unscoped.where(id: account_ids).delete_all_and_assocs_without_instantiation_builder(models_and_ids_list, errors, options)
|
53
|
+
|
54
|
+
return models_and_ids_list, errors
|
55
|
+
end
|
56
|
+
end
|
57
|
+
```
|
data/lib/rails_delete_all_and_assocs_without_instantiation/delete_all_and_assocs_extension.rb
CHANGED
@@ -37,7 +37,7 @@ module RailsDeleteAllAndAssocsWithoutInstantiation
|
|
37
37
|
|
38
38
|
# prevent infinite recursion here.
|
39
39
|
ids = ids - models_and_ids_list[self.name]
|
40
|
-
if ids.none?
|
40
|
+
if ids.none? || ids.nil?
|
41
41
|
return models_and_ids_list, errors
|
42
42
|
end
|
43
43
|
|
@@ -160,22 +160,31 @@ module RailsDeleteAllAndAssocsWithoutInstantiation
|
|
160
160
|
|
161
161
|
ActiveRecord::Base.transaction do
|
162
162
|
built_deletions.keys.reverse.each do |class_name|
|
163
|
+
ids = "N/A"
|
163
164
|
begin
|
164
165
|
ids = built_deletions[class_name]
|
165
|
-
next if ids.none?
|
166
|
+
next if ids.none? || ids.nil?
|
166
167
|
klass = class_name.constantize
|
167
168
|
klass.unscoped.where(id: ids).delete_all
|
168
169
|
rescue Exception => e
|
170
|
+
puts "DEL ATTEMPT 1: #{class_name}.unscoped.where(id: #{ids}).delete_all" if options[:verbose]
|
169
171
|
retry_due_to_errors << class_name
|
170
172
|
end
|
171
173
|
end
|
172
174
|
|
175
|
+
if options[:verbose]
|
176
|
+
puts "RETRY DUE TO ERRORS:"
|
177
|
+
puts retry_due_to_errors.inspect
|
178
|
+
end
|
179
|
+
|
173
180
|
# ActiveRecord::InvalidForeignKey can cause issues in ordering.
|
174
|
-
retry_due_to_errors.
|
181
|
+
retry_due_to_errors.each do |class_name|
|
182
|
+
ids = "N/A"
|
175
183
|
begin
|
176
184
|
ids = built_deletions[class_name]
|
177
|
-
next if ids.none?
|
185
|
+
next if ids.none? || ids.nil?
|
178
186
|
klass = class_name.constantize
|
187
|
+
puts "DEL ATTEMPT 2: #{class_name}.unscoped.where(id: #{ids}).delete_all" if options[:verbose]
|
179
188
|
klass.unscoped.where(id: ids).delete_all
|
180
189
|
# if Rails.env.test? || Rails.env.development?
|
181
190
|
# if count = klass.unscoped.where(id: ids).count > 0
|
@@ -185,20 +194,27 @@ module RailsDeleteAllAndAssocsWithoutInstantiation
|
|
185
194
|
rescue Exception => e
|
186
195
|
# ActiveRecord::Base.transaction obscures the actual errors
|
187
196
|
# - need to run again outside of block to get actual error
|
188
|
-
retry_to_capture_errors << [
|
197
|
+
retry_to_capture_errors << [class_name, ids]
|
189
198
|
raise ActiveRecord::Rollback
|
190
199
|
end
|
191
200
|
end
|
192
201
|
end
|
193
202
|
|
194
|
-
retry_to_capture_errors.each do |
|
203
|
+
retry_to_capture_errors.each do |class_name, ids|
|
204
|
+
if ids == "N/A"
|
205
|
+
errors << ["Internal Server Error, could not locate IDs", class_name]
|
206
|
+
next
|
207
|
+
end
|
195
208
|
begin
|
209
|
+
klass = class_name.constantize
|
210
|
+
puts "DEL ATTEMPT 3: #{class_name}.unscoped.where(id: #{ids}).delete_all" if options[:verbose]
|
196
211
|
klass.unscoped.where(id: ids).delete_all
|
197
212
|
# should never get past this line, we're expecting an error!
|
198
213
|
# - if we do, maybe was an intermittent issue. Call ourselves recursively to try again.
|
199
|
-
return current_query.delete_all_and_assocs_without_instantiation(options)
|
214
|
+
# return current_query.delete_all_and_assocs_without_instantiation(options)
|
215
|
+
errors << ["#{class_name} - expected error, ran into 2 errors on previous deletion attempts", ids]
|
200
216
|
rescue Exception => e
|
201
|
-
errors << e.class.to_s + "; " + e.message
|
217
|
+
errors << [e.class.to_s + "; " + e.message, e.backtrace]
|
202
218
|
end
|
203
219
|
|
204
220
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{rails_delete_all_and_assocs_without_instantiation}
|
5
|
-
s.version = "0.0.
|
5
|
+
s.version = "0.0.4"
|
6
6
|
s.date = %q{2023-03-02}
|
7
7
|
s.authors = ["benjamin.dana.software.dev@gmail.com"]
|
8
8
|
s.summary = %q{Non-instantiated way of deleting records with dependencies quickly without instantiation.}
|