Module: StrongMigrations::SafeMethods

Included in:
Checker
Defined in:
lib/strong_migrations/safe_methods.rb

Instance Method Summary collapse

Instance Method Details

#disable_transactionObject

hard to commit at right time when reverting so just commit at start



114
115
116
117
118
119
# File 'lib/strong_migrations/safe_methods.rb', line 114

def disable_transaction
  if in_transaction? && !transaction_disabled
    @migration.connection.commit_db_transaction
    self.transaction_disabled = true
  end
end

#in_transaction?Boolean

Returns:

  • (Boolean)


121
122
123
# File 'lib/strong_migrations/safe_methods.rb', line 121

def in_transaction?
  @migration.connection.open_transactions > 0
end

#safe_add_check_constraint(table, expression, add_options, validate_options) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/strong_migrations/safe_methods.rb', line 70

def safe_add_check_constraint(table, expression, add_options, validate_options)
  @migration.reversible do |dir|
    dir.up do
      @migration.add_check_constraint(table, expression, **add_options)
      disable_transaction
      @migration.validate_check_constraint(table, **validate_options)
    end
    dir.down do
      @migration.remove_check_constraint(table, expression, **add_options)
    end
  end
end

#safe_add_foreign_key(from_table, to_table, options) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/strong_migrations/safe_methods.rb', line 42

def safe_add_foreign_key(from_table, to_table, options)
  @migration.reversible do |dir|
    dir.up do
      @migration.add_foreign_key(from_table, to_table, **options.merge(validate: false))
      disable_transaction
      @migration.validate_foreign_key(from_table, to_table)
    end
    dir.down do
      @migration.remove_foreign_key(from_table, to_table)
    end
  end
end

#safe_add_foreign_key_code(from_table, to_table, add_code, validate_code) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/strong_migrations/safe_methods.rb', line 55

def safe_add_foreign_key_code(from_table, to_table, add_code, validate_code)
  @migration.reversible do |dir|
    dir.up do
      @migration.safety_assured do
        @migration.execute(add_code)
        disable_transaction
        @migration.execute(validate_code)
      end
    end
    dir.down do
      @migration.remove_foreign_key(from_table, to_table)
    end
  end
end

#safe_add_index(table, columns, options) ⇒ Object

TODO check if invalid index with expected name exists and remove if needed



8
9
10
11
# File 'lib/strong_migrations/safe_methods.rb', line 8

def safe_add_index(table, columns, options)
  disable_transaction
  @migration.add_index(table, columns, **options.merge(algorithm: :concurrently))
end

#safe_add_reference(table, reference, options) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/strong_migrations/safe_methods.rb', line 18

def safe_add_reference(table, reference, options)
  @migration.reversible do |dir|
    dir.up do
      disable_transaction
      foreign_key = options.delete(:foreign_key)
      @migration.add_reference(table, reference, **options)
      if foreign_key
        # same as Active Record
        name =
          if foreign_key.is_a?(Hash) && foreign_key[:to_table]
            foreign_key[:to_table]
          else
            (ActiveRecord::Base.pluralize_table_names ? reference.to_s.pluralize : reference).to_sym
          end

        @migration.add_foreign_key(table, name)
      end
    end
    dir.down do
      @migration.remove_reference(table, reference)
    end
  end
end

#safe_by_default_method?(method) ⇒ Boolean

Returns:

  • (Boolean)


3
4
5
# File 'lib/strong_migrations/safe_methods.rb', line 3

def safe_by_default_method?(method)
  StrongMigrations.safe_by_default && [:add_index, :add_belongs_to, :add_reference, :remove_index, :add_foreign_key, :add_check_constraint, :change_column_null].include?(method)
end

#safe_change_column_null(add_code, validate_code, change_args, remove_code) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/strong_migrations/safe_methods.rb', line 83

def safe_change_column_null(add_code, validate_code, change_args, remove_code)
  @migration.reversible do |dir|
    dir.up do
      @migration.safety_assured do
        @migration.execute(add_code)
        disable_transaction
        @migration.execute(validate_code)
      end
      if change_args
        @migration.change_column_null(*change_args)
        @migration.safety_assured do
          @migration.execute(remove_code)
        end
      end
    end
    dir.down do
      if change_args
        down_args = change_args.dup
        down_args[2] = true
        @migration.change_column_null(*down_args)
      else
        @migration.safety_assured do
          @migration.execute(remove_code)
        end
      end
    end
  end
end

#safe_remove_index(table, options) ⇒ Object



13
14
15
16
# File 'lib/strong_migrations/safe_methods.rb', line 13

def safe_remove_index(table, options)
  disable_transaction
  @migration.remove_index(table, **options.merge(algorithm: :concurrently))
end