mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-11-12 20:24:43 +08:00
125 lines
4.5 KiB
Ruby
125 lines
4.5 KiB
Ruby
class CreateProtocols < ActiveRecord::Migration
|
|
def up
|
|
# First, create protocol table
|
|
create_table :protocols do |t|
|
|
t.string :name
|
|
t.text :authors
|
|
t.text :description
|
|
t.integer :added_by_id
|
|
t.integer :my_module_id
|
|
t.integer :organization_id, null: false
|
|
t.integer :protocol_type, null: false, default: 0
|
|
t.integer :parent_id
|
|
t.datetime :parent_updated_at
|
|
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 :protocols, :users, column: :added_by_id
|
|
add_foreign_key :protocols, :my_modules, column: :my_module_id
|
|
add_foreign_key :protocols, :organizations, column: :organization_id
|
|
add_foreign_key :protocols, :protocols, column: :parent_id
|
|
add_foreign_key :protocols, :users, column: :archived_by_id
|
|
add_foreign_key :protocols, :users, column: :restored_by_id
|
|
add_index :protocols, :name
|
|
add_index :protocols, :authors
|
|
add_index :protocols, :description
|
|
add_index :protocols, :added_by_id
|
|
add_index :protocols, :my_module_id
|
|
add_index :protocols, :organization_id
|
|
add_index :protocols, :parent_id
|
|
add_index :protocols, :archived_by_id
|
|
add_index :protocols, :restored_by_id
|
|
|
|
# Also create keywords, this will be unused at the start
|
|
create_table :protocol_keywords do |t|
|
|
t.string :name
|
|
t.timestamps null: false
|
|
end
|
|
add_index :protocol_keywords, :name
|
|
|
|
# .. and the many-to-many association
|
|
create_table :protocol_protocol_keywords do |t|
|
|
t.integer :protocol_id, null: false
|
|
t.integer :protocol_keyword_id, null: false
|
|
end
|
|
add_foreign_key :protocol_protocol_keywords, :protocols
|
|
add_foreign_key :protocol_protocol_keywords, :protocol_keywords
|
|
add_index :protocol_protocol_keywords, :protocol_id
|
|
add_index :protocol_protocol_keywords, :protocol_keyword_id
|
|
|
|
# Alright: now, the "real" data migration needs to happen
|
|
add_column :steps, :protocol_id, :integer
|
|
add_foreign_key :steps, :protocols, column: :protocol_id
|
|
add_index :steps, :protocol_id
|
|
|
|
MyModule.find_each do |my_module|
|
|
protocol = Protocol.new(
|
|
my_module_id: my_module.id,
|
|
organization_id: my_module.project.organization.id,
|
|
protocol_type: 0
|
|
)
|
|
protocol.save(validate: false)
|
|
|
|
Step.where(my_module_id: my_module.id).find_each do |step|
|
|
step.update_column(:protocol_id, protocol.id)
|
|
end
|
|
end
|
|
|
|
remove_index :steps, column: :my_module_id
|
|
remove_foreign_key :steps, :my_modules
|
|
remove_column :steps, :my_module_id
|
|
change_column_null :steps, :protocol_id, false
|
|
end
|
|
|
|
def down
|
|
add_column :steps, :my_module_id, :integer
|
|
add_foreign_key :steps, :my_modules
|
|
add_index :steps, :my_module_id
|
|
|
|
MyModule.find_each do |my_module|
|
|
protocol = Protocol.where(my_module_id: my_module.id).first
|
|
if protocol.present?
|
|
Step.where(protocol_id: protocol.id).find_each do |step|
|
|
step.update_column(:my_module_id, my_module.id)
|
|
end
|
|
end
|
|
end
|
|
|
|
remove_index :steps, column: :protocol_id
|
|
remove_foreign_key :steps, :protocols
|
|
remove_column :steps, :protocol_id
|
|
|
|
# Simply drop the rest of the protocols
|
|
# (the ones that are organization-wide)
|
|
|
|
remove_index :protocol_protocol_keywords, column: :protocol_id
|
|
remove_index :protocol_protocol_keywords, column: :protocol_keyword_id
|
|
remove_foreign_key :protocol_protocol_keywords, :protocols
|
|
remove_foreign_key :protocol_protocol_keywords, :protocol_keywords
|
|
drop_table :protocol_protocol_keywords
|
|
|
|
remove_index :protocol_keywords, column: :name
|
|
drop_table :protocol_keywords
|
|
|
|
remove_index :protocols, column: :name
|
|
remove_index :protocols, column: :authors
|
|
remove_index :protocols, column: :description
|
|
remove_index :protocols, column: :added_by_id
|
|
remove_index :protocols, column: :my_module_id
|
|
remove_index :protocols, column: :organization_id
|
|
remove_index :protocols, column: :parent_id
|
|
remove_index :protocols, column: :archived_by_id
|
|
remove_index :protocols, column: :restored_by_id
|
|
remove_foreign_key :protocols, column: :added_by_id
|
|
remove_foreign_key :protocols, :my_modules
|
|
remove_foreign_key :protocols, :organizations
|
|
remove_foreign_key :protocols, column: :parent_id
|
|
remove_foreign_key :protocols, column: :archived_by_id
|
|
remove_foreign_key :protocols, column: :restored_by_id
|
|
drop_table :protocols
|
|
end
|
|
end
|