Z dowolnego kontrolera można zdefiniować następującą metodę.
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
Zauważ, że nie wiem na pewno, czy zachowa to integralność klucza. Myślę, że zależy to w dużej mierze od tego, jak tworzona jest baza danych szablonu.
Oto kilka przydatnych informacji. Dzięki. – Tilendor
Czy moja odpowiedź działa dla ciebie? a przynajmniej pomóc? – abarax
Jestem naprawdę nieufny wobec konieczności pójścia do powłoki dla rzeczy, które mogą być wykonane wewnątrz kodu. Nie chcę wprowadzać niepotrzebnej zależności. Ale podany przez ciebie link był bardzo przydatny w przypadku czegoś zupełnie niezwiązanego. – Tilendor