Desde cualquier controlador, puede definir el siguiente método.
def copy_template_database
template_name = "customerdb1" # Database to copy from
new_name = "temp" #database to create & copy to
#connect to template database to copy. Note that this will override any previous
#connections for all Models that inherit from ActiveRecord::Base
ActiveRecord::Base.establish_connection({:adapter => "mysql", :database => template_name, :host => "olddev",
:username => "root", :password => "password" })
sql_connection = ActiveRecord::Base.connection
sql_connection.execute("CREATE DATABASE #{new_name} CHARACTER SET latin1 COLLATE latin1_general_ci")
tables = sql_connection.select_all("Show Tables")
#the results are an array of hashes, ie:
# [{"table_from_customerdb1" => "customers"},{"table_from_customerdb1" => "employees},...]
table_names = Array.new
tables.each { |hash| hash.each_value { |name| table_names << name }}
table_names.each { |name|
sql_connection.execute("CREATE TABLE #{new_name}.#{name} LIKE #{template_name}.#{name}")
sql_connection.execute("INSERT INTO #{new_name}.#{name} SELECT * FROM #{template_name}.#{name}")
}
#This statement is optional. It connects ActiveRecord to the new database
ActiveRecord::Base.establish_connection({:adapter => "mysql", :database => new_name, :host => "olddev",
:username => "root", :password => "password" })
end
Tenga en cuenta que no estoy seguro si esto mantendrá la integridad de la llave foriegn. Creo que depende mucho de cómo se crea la plantilla de la base de datos.
Esa es información útil. Gracias. – Tilendor
¿Mi respuesta ha funcionado para usted? o al menos ayuda? – abarax
Soy muy cuidadoso de tener que ir al shell por cosas que se pueden hacer dentro del código. No quiero introducir una dependencia innecesaria. Pero el enlace que brindó fue muy útil para algo completamente diferente. – Tilendor