Автоматические миграции
Мне всегда немного не нравились миграции тем, что они разрастаются и описание моделей становится размазанным. К тому же я часто забываю добавить какую-нибудь колонку или путаю тип. Ради каждой из таких операций создавать отдельную миграцию довольно утомительно. Во всех своих проектах мы используем авто-миграции, которые я недавно опубликовал как отдельный гем.
Инсталяция - классическая: добавить 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