Ответ 1
Попробуйте сделать это с помощью чистого SQL. Это сделает то, что вы хотите:
CREATE TABLE new_tbl LIKE orig_tbl;
Мне нужна миграция для создания клона существующей таблицы, просто суффиксом имени, включая все индексы из исходной таблицы.
Итак, есть таблица "моментальных снимков", и я хочу создать "snapshots_temp" как точную копию таблицы (а не данные, только схему таблицы, но включая индексы).
Я мог бы просто скопировать и вставить блок из файла schema.rb и вручную переименовать его.
Но я не уверен, к моменту применения этой миграции, если определение из schema.rb будет по-прежнему точным. Другой разработчик, возможно, изменил таблицу, и мне не нужно обновлять мою миграцию script.
Итак, как я могу получить схему таблицы во время выполнения? По сути, как "rake schema: dump" реконструирует таблицу, чтобы я мог сделать то же самое в моей миграции? (но изменение имени таблицы).
Попробуйте сделать это с помощью чистого SQL. Это сделает то, что вы хотите:
CREATE TABLE new_tbl LIKE orig_tbl;
Это будет сделано. Это не идеально, потому что он не будет копировать параметры таблицы или индексы. Если у вас есть какие-либо параметры таблицы, вам придется вручную добавить их в эту миграцию.
Чтобы скопировать индексы, вам нужно будет сформулировать SQL-запрос, чтобы выбрать их, а затем обработать их в новые директивы add_index. Это немного выше моих знаний. Но это работает для копирования структуры.
class CopyTableSchema < ActiveRecord::Migration
def self.up
create_table :new_models do |t|
Model.columns.each do |column|
next if column.name == "id" # already created by create_table
t.send(column.type.to_sym, column.name.to_sym, :null => column.null,
:limit => column.limit, :default => column.default, :scale => column.scale,
:precision => column.precision)
end
end
# copy data
Model.all.each do |m|
NewModel.create m.attributes
end
end
def self.down
drop_table :new_models
end
end
В Rails 4 и PostgreSQL создайте новую миграцию и вставьте:
ActiveRecord::Base.connection.execute("CREATE TABLE clone_table_name AS SELECT * FROM source_table_name;")
Это создаст клон с точной структурой исходной таблицы и заполнит новую таблицу старыми значениями.
Дополнительная информация: http://www.postgresql.org/docs/9.0/static/sql-createtableas.html
Похоже, что эта логика завернута в ActiveRecord:: SchemaDumper, но она только предоставляет метод "дампа" "все-в-одном" и вы не можете сбросить только определенную таблицу (метод таблицы) является закрытым).
Скопируйте запись таблиц из ваших проектов db/schema.rb
прямо в вашу миграцию. Просто измените имя таблицы и ваше хорошее, чтобы идти.