scinote-web/db/migrate/20160722082700_add_experiment_level.rb
2016-07-22 10:43:55 +02:00

113 lines
4.2 KiB
Ruby

class AddExperimentLevel < ActiveRecord::Migration
def up
# Create experiments table
create_table :experiments do |t|
t.string :name, null: false
t.text :description
t.integer :project_id, null: false
t.integer :created_by_id, null: false
t.integer :updated_by_id, null: false
t.boolean :archived, null: false, default: false
t.integer :archived_by_id
t.datetime :archived_on
t.integer :restored_by_id
t.datetime :restored_on
t.timestamps null: false
end
add_foreign_key :experiments, :users, column: :created_by_id
add_foreign_key :experiments, :users, column: :updated_by_id
add_foreign_key :experiments, :users, column: :archived_by_id
add_foreign_key :experiments, :users, column: :restored_by_id
add_index :experiments, :name
add_index :experiments, :project_id
add_index :experiments, :created_by_id
add_index :experiments, :updated_by_id
add_index :experiments, :archived_by_id
add_index :experiments, :restored_by_id
add_column :my_modules, :experiment_id, :integer, default: 0
add_column :my_module_groups, :experiment_id, :integer, default: 0
# Iterate through all projects
Project.find_each do |project|
my_modules = MyModule.where('project_id = ?', project.id)
my_module_groups = MyModuleGroup.where('project_id = ?', project.id)
if my_modules.count > 0
# Create an experiment
owner = project.user_projects.where(role: 0).first.user
exp = Experiment.create(
name: 'Test experiment',
project: project,
created_by: owner,
updated_by: owner
)
# Assign all modules onto new experiment
my_modules.find_each do |mm|
mm.update_column(:experiment_id, exp.id)
end
if my_module_groups.count > 0
# Also assign all module groups onto new experiment
my_module_groups.find_each do |mmg|
mmg.update_column(:experiment_id, exp.id)
end
end
end
end
change_column_null :my_modules, :experiment_id, false
remove_column :my_modules, :project_id
add_foreign_key :my_modules, :experiments, column: :experiment_id
add_index :my_modules, :experiment_id
change_column_null :my_module_groups, :experiment_id, false
remove_column :my_module_groups, :project_id
add_foreign_key :my_module_groups, :experiments, column: :experiment_id
add_index :my_module_groups, :experiment_id
end
def down
add_column :my_modules, :project_id, :integer, default: 0
add_column :my_module_groups, :project_id, :integer, default: 0
# Update reference to projects from modules
MyModule.find_each do |mm|
exp = Experiment.where('id = ?', mm[:experiment_id]).take
project = Project.where('id = ?', exp[:project_id]).take
mm.update_column(:project_id, project.id)
end
# Update reference to projects from module groups
MyModuleGroup.find_each do |mmg|
exp = Experiment.where('id = ?', mmg[:experiment_id]).take
project = Project.where('id = ?', exp[:project_id]).take
mmg.update_column(:project_id, project.id)
end
change_column_null :my_modules, :project_id, false
remove_index :my_modules, column: :experiment_id
remove_foreign_key :my_modules, column: :experiment_id
remove_column :my_modules, :experiment_id
change_column_null :my_module_groups, :project_id, false
remove_index :my_module_groups, column: :experiment_id
remove_foreign_key :my_module_groups, column: :experiment_id
remove_column :my_module_groups, :experiment_id
# Drop experiments table
remove_index :experiments, column: :name
remove_index :experiments, column: :project_id
remove_index :experiments, column: :created_by_id
remove_index :experiments, column: :updated_by_id
remove_index :experiments, column: :archived_by_id
remove_index :experiments, column: :restored_by_id
remove_foreign_key :experiments, column: :created_by_id
remove_foreign_key :experiments, column: :updated_by_id
remove_foreign_key :experiments, column: :archived_by_id
remove_foreign_key :experiments, column: :restored_by_id
drop_table :experiments
end
end