diff options
Diffstat (limited to 'app/services/loose_foreign_keys/cleaner_service.rb')
-rw-r--r-- | app/services/loose_foreign_keys/cleaner_service.rb | 30 |
1 files changed, 14 insertions, 16 deletions
diff --git a/app/services/loose_foreign_keys/cleaner_service.rb b/app/services/loose_foreign_keys/cleaner_service.rb index 8fe053e2edf..44a922aad87 100644 --- a/app/services/loose_foreign_keys/cleaner_service.rb +++ b/app/services/loose_foreign_keys/cleaner_service.rb @@ -6,11 +6,9 @@ module LooseForeignKeys DELETE_LIMIT = 1000 UPDATE_LIMIT = 500 - delegate :connection, to: :model - - def initialize(model:, foreign_key_definition:, deleted_parent_records:, with_skip_locked: false) - @model = model - @foreign_key_definition = foreign_key_definition + def initialize(loose_foreign_key_definition:, connection:, deleted_parent_records:, with_skip_locked: false) + @loose_foreign_key_definition = loose_foreign_key_definition + @connection = connection @deleted_parent_records = deleted_parent_records @with_skip_locked = with_skip_locked end @@ -18,20 +16,20 @@ module LooseForeignKeys def execute result = connection.execute(build_query) - { affected_rows: result.cmd_tuples, table: foreign_key_definition.to_table } + { affected_rows: result.cmd_tuples, table: loose_foreign_key_definition.from_table } end def async_delete? - foreign_key_definition.on_delete == :async_delete + loose_foreign_key_definition.on_delete == :async_delete end def async_nullify? - foreign_key_definition.on_delete == :async_nullify + loose_foreign_key_definition.on_delete == :async_nullify end private - attr_reader :model, :foreign_key_definition, :deleted_parent_records, :with_skip_locked + attr_reader :loose_foreign_key_definition, :connection, :deleted_parent_records, :with_skip_locked def build_query query = if async_delete? @@ -39,10 +37,10 @@ module LooseForeignKeys elsif async_nullify? update_query else - raise "Invalid on_delete argument: #{foreign_key_definition.on_delete}" + raise "Invalid on_delete argument: #{loose_foreign_key_definition.on_delete}" end - unless query.include?(%{"#{foreign_key_definition.column}" IN (}) + unless query.include?(%{"#{loose_foreign_key_definition.column}" IN (}) raise("FATAL: foreign key condition is missing from the generated query: #{query}") end @@ -50,15 +48,15 @@ module LooseForeignKeys end def arel_table - @arel_table ||= model.arel_table + @arel_table ||= Arel::Table.new(loose_foreign_key_definition.from_table) end def primary_keys - @primary_keys ||= connection.primary_keys(model.table_name).map { |key| arel_table[key] } + @primary_keys ||= connection.primary_keys(loose_foreign_key_definition.from_table).map { |key| arel_table[key] } end def quoted_table_name - @quoted_table_name ||= Arel.sql(connection.quote_table_name(model.table_name)) + @quoted_table_name ||= Arel.sql(connection.quote_table_name(loose_foreign_key_definition.from_table)) end def delete_query @@ -71,7 +69,7 @@ module LooseForeignKeys def update_query query = Arel::UpdateManager.new query.table(quoted_table_name) - query.set([[arel_table[foreign_key_definition.column], nil]]) + query.set([[arel_table[loose_foreign_key_definition.column], nil]]) add_in_query_with_limit(query, UPDATE_LIMIT) end @@ -88,7 +86,7 @@ module LooseForeignKeys def in_query_with_limit(limit) in_query = Arel::SelectManager.new in_query.from(quoted_table_name) - in_query.where(arel_table[foreign_key_definition.column].in(deleted_parent_records.map(&:primary_key_value))) + in_query.where(arel_table[loose_foreign_key_definition.column].in(deleted_parent_records.map(&:primary_key_value))) in_query.projections = primary_keys in_query.take(limit) in_query.lock(Arel.sql('FOR UPDATE SKIP LOCKED')) if with_skip_locked |