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
74
75
76
77
78
79
80
|
# File 'app/controllers/erd/erd_controller.rb', line 22
def update
changes = 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::Migrator.execute_generate_model model, columns
Erd::Migrator.run_migrations :up => generated_migration_file
executed_migrations << generated_migration_file
when 'remove_model'
model = model.tableize
generated_migration_file = Erd::Migrator.execute_generate_migration "drop_#{model}"
gsub_file generated_migration_file, /def (up|change).* end/m, "def change\n drop_table :#{model}\n end"
Erd::Migrator.run_migrations :up => generated_migration_file
executed_migrations << generated_migration_file
when 'rename_model'
model, from, to = from.tableize, to.tableize, model.tableize
generated_migration_file = Erd::Migrator.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"
Erd::Migrator.run_migrations :up => generated_migration_file
executed_migrations << generated_migration_file
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::Migrator.execute_generate_migration "add_#{name}_to_#{model}", ["#{name}:#{type}"]
Erd::Migrator.run_migrations :up => generated_migration_file
executed_migrations << generated_migration_file
when 'rename_column'
model = model.tableize
generated_migration_file = Erd::Migrator.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"
Erd::Migrator.run_migrations :up => generated_migration_file
executed_migrations << generated_migration_file
when 'alter_column'
model = model.tableize
generated_migration_file = Erd::Migrator.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"
Erd::Migrator.run_migrations :up => generated_migration_file
executed_migrations << generated_migration_file
when 'move'
model = model.tableize
json_file = Rails.root.join('tmp', 'erd_positions.json')
positions = json_file.exist? ? ActiveSupport::JSON.decode(json_file.read) : {}
positions[model] = to
json_file.open('w') {|f| f.write positions.to_json}
else
raise "unexpected action: #{action}"
end
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
|