Class: Migration::ColumnDropper
- Inherits:
-
Object
- Object
- Migration::ColumnDropper
- Defined in:
- lib/migration/column_dropper.rb
Class Method Summary collapse
- .drop_readonly(table_name, column_name) ⇒ Object
- .execute_drop(table, columns) ⇒ Object
- .mark_readonly(table_name, column_name) ⇒ Object
Class Method Details
.drop_readonly(table_name, column_name) ⇒ Object
40 41 42 43 44 45 46 47 |
# File 'lib/migration/column_dropper.rb', line 40 def self.drop_readonly(table_name, column_name) BaseDropper.drop_readonly_function(table_name, column_name) # Backward compatibility for old functions created in the public schema DB.exec( "DROP FUNCTION IF EXISTS #{BaseDropper.old_readonly_function_name(table_name, column_name)} CASCADE", ) end |
.execute_drop(table, columns) ⇒ Object
29 30 31 32 33 34 35 36 37 38 |
# File 'lib/migration/column_dropper.rb', line 29 def self.execute_drop(table, columns) table = table.to_s columns.each do |column| column = column.to_s self.drop_readonly(table, column) # safe cause it is protected on method entry, can not be passed in params DB.exec("ALTER TABLE #{table} DROP COLUMN IF EXISTS #{column}") end end |
.mark_readonly(table_name, column_name) ⇒ Object
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/migration/column_dropper.rb', line 7 def self.mark_readonly(table_name, column_name) has_default = DB.query_single(<<~SQL, table_name: table_name, column_name: column_name).first SELECT column_default IS NOT NULL FROM information_schema.columns WHERE table_name = :table_name AND column_name = :column_name SQL raise "You must drop a column's default value before marking it as readonly" if has_default BaseDropper.create_readonly_function(table_name, column_name) DB.exec <<~SQL CREATE TRIGGER #{BaseDropper.readonly_trigger_name(table_name, column_name)} BEFORE INSERT OR UPDATE OF #{column_name} ON #{table_name} FOR EACH ROW WHEN (NEW.#{column_name} IS NOT NULL) EXECUTE PROCEDURE #{BaseDropper.readonly_function_name(table_name, column_name)}; SQL end |