20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
# File 'app/controllers/erd/erd_controller.rb', line 20
def update
if params[:position_changes].present?
position_changes = ActiveSupport::JSON.decode(params[:position_changes])
positions = saved_positions
positions.merge! position_changes.transform_keys(&:tableize)
POSITIONS_JSON_FILE.open('w') {|f| f.write positions.to_json }
end
changes = params[:changes].present? ? ActiveSupport::JSON.decode(params[:changes]) : []
executed_migrations, failed_migrations = [], []
changes.each do |row|
begin
action, model, column, from, to = row['action'], row['model'], row['column'], row['from'], row['to']
case action
when 'create_model'
columns = column.split(' ').compact
generated_migration_file = Erd::GenaratorRunner.execute_generate_model model, columns
when 'remove_model'
model = model.tableize
generated_migration_file = Erd::GenaratorRunner.execute_generate_migration "drop_#{model}"
gsub_file generated_migration_file, /def (up|change).* end/m, "def change\n drop_table :#{model}\n end"
when 'rename_model'
_model, from, to = from.tableize, to.tableize, model.tableize
generated_migration_file = Erd::GenaratorRunner.execute_generate_migration "rename_#{from}_to_#{to}"
gsub_file generated_migration_file, /def (up|change).* end/m, "def change\n rename_table :#{from}, :#{to}\n end"
when 'add_column'
model = model.tableize
name_and_type = column.scan(/(.*)\((.*?)\)/).first
name, type = name_and_type[0], name_and_type[1]
generated_migration_file = Erd::GenaratorRunner.execute_generate_migration "add_#{name}_to_#{model}", ["#{name}:#{type}"]
when 'rename_column'
model = model.tableize
generated_migration_file = Erd::GenaratorRunner.execute_generate_migration "rename_#{model}_#{from}_to_#{to}"
gsub_file generated_migration_file, /def (up|change).* end/m, "def change\n rename_column :#{model}, :#{from}, :#{to}\n end"
when 'alter_column'
model = model.tableize
generated_migration_file = Erd::GenaratorRunner.execute_generate_migration "change_#{model}_#{column}_type_to_#{to}"
gsub_file generated_migration_file, /def (up|change).* end/m, "def change\n change_column :#{model}, :#{column}, :#{to}\n end"
when 'move'
else
raise "unexpected action: #{action}"
end
Erd::Migrator.run_migrations :up => generated_migration_file
executed_migrations << generated_migration_file
rescue ::Erd::MigrationError => e
failed_migrations << e.message
end
end
redirect_to erd.root_path, :flash => {:executed_migrations => {:up => executed_migrations}, :failed_migrations => failed_migrations}
end
|