Автоматические миграции

March 24, 2012

Мне всегда немного не нравились миграции тем, что они разрастаются и описание моделей становится размазанным. К тому же я часто забываю добавить какую-нибудь колонку или путаю тип. Ради каждой из таких операций создавать отдельную миграцию довольно утомительно. Во всех своих проектах мы используем авто-миграции, которые я недавно опубликовал как отдельный гем.

Инсталяция - классическая: добавить gem 'automigration' в Gemfile и bundle install.

Теперь добавьте описание колонок моделей прямо в модели:

class User < ActiveRecord::Base
  has_fields do
    string :name
    integer :login_count
  end
end

и запустите миграции:

rake db:create db:migrate

Гем автоматически создает необходимые таблицы, удаляет устаревшие, добавляет/удаляет/обновляет колонки, описанные в моделях. После этого запускаются классические миграции. Таким образом количество необходимых миграций сильно сокращается.

Известные недостатки

Сейчас есть несколько известных дефектов и неточностей:

  • Сложности при переименовании колонки. По умолчанию авто-миграции удалят старую колонку и создадут новую. Если нужно при этом сохранить старый контент, то необходимо либо сделать это вручную, либо создать временную миграцию, которая перенесет информацию. Но такая ситуация довольно редкая.
  • Гем работает только с PostgreSQL. Возможно он работает и с другими базами, никогда не проверял.
  • Миграции из гемов-енджинов будет работать неправильно. Это я исправлю.
  • Для того, чтобы подцепились модели из гемов-енджинов необходимо указать путь до папки с моделями (используется только при исполнении задачи rake db:migration):
module Custom
  class Engine < Rails::Engine
    initializer 'custom' do |app|
      app.config.automigration.model_paths << File.expand_path("../../../app/models", __FILE__)
    end
  end
end
comments powered by Disqus