Я предпочитаю просто написать метод up начальной миграции с помощью вызовов SQL:
class InitialDbStructure < ActiveRecord::Migration
def up
execute "CREATE TABLE abouts (
id INTEGER UNSIGNED AUTO_INCREMENT,
updated_at TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_at TIMESTAMP,
title VARCHAR(125),
body MEDIUMTEXT,
CONSTRAINT PK_id PRIMARY KEY (id),
INDEX ORDER_id (id ASC)
) ENGINE=InnoDB;"
end
ПРИМЕЧАНИЯ
Вы обнаружите, особенно если вы часто перестраиваете и заново заполняете таблицы (rake db: drop db: create db: schema: load db: fixtures: load), что инструкции execute выполняются намного быстрее, чем интерпретируются Синтаксис Ruby. Например, нашим таблицам требуется более 55 секунд для восстановления из миграций Rails в синтаксисе Ruby, тогда как операторы execute заново генерируют и повторно заполняют наши таблицы за 20 секунд. Это, конечно, является существенной проблемой в проектах, где первоначальный контент регулярно пересматривается или спецификации таблиц регулярно пересматриваются.
Возможно, что не менее важно, вы можете сохранить эту скорость перестроения и повторного заполнения, поддерживая единственную исходную миграцию в исполняемом синтаксисе SQL и повторно выполняя миграции (этого отдельного файла), сначала потрокая ваш schema.rb, а затем запустив rake db: сброс перед повторным заполнением ваших таблиц. Убедитесь, что вы установили: version => 0, так что вы получите новую схему, верную для вашей миграции:
ActiveRecord::Schema.define(:version => 0) do
end