Class: Gitlab::BackgroundMigration::CopyColumn

Inherits:
Object
  • Object
show all
Defined in:
lib/gitlab/background_migration/copy_column.rb

Overview

CopyColumn is a simple (reusable) background migration that can be used to update the value of a column based on the value of another column in the same table.

For this background migration to work the table that is migrated has to have an `id` column as the primary key.

Instance Method Summary collapse

Instance Method Details

#connectionObject


36
37
38
# File 'lib/gitlab/background_migration/copy_column.rb', line 36

def connection
  ActiveRecord::Base.connection
end

#perform(table, copy_from, copy_to, start_id, end_id) ⇒ Object

table - The name of the table that contains the columns. copy_from - The column containing the data to copy. copy_to - The column to copy the data to. start_id - The start ID of the range of rows to update. end_id - The end ID of the range of rows to update.


17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/gitlab/background_migration/copy_column.rb', line 17

def perform(table, copy_from, copy_to, start_id, end_id)
  return unless connection.column_exists?(table, copy_to)

  quoted_table = connection.quote_table_name(table)
  quoted_copy_from = connection.quote_column_name(copy_from)
  quoted_copy_to = connection.quote_column_name(copy_to)

  # We're using raw SQL here since this job may be frequently executed. As
  # a result dynamically defining models would lead to many unnecessary
  # schema information queries.
  connection.execute <<-SQL.strip_heredoc
  UPDATE #{quoted_table}
  SET #{quoted_copy_to} = #{quoted_copy_from}
  WHERE id BETWEEN #{start_id} AND #{end_id}
  AND #{quoted_copy_from} IS NOT NULL
  AND #{quoted_copy_to} IS NULL
  SQL
end