Миграции размещаются в ./db/migrations.
Порядок выполнения миграций определяется временем ее создания в имени файла миграции.
Информация о текущей версии миграции сохраняется в базе в таблице schema_migrations и в файле db./db/shcema.rb.
railg g migration CreateТаблицаs поле1 модель1:references модель2:belongs_to поле2:тип поле3:тип:index
Если тип поля не указан, тип будет :text.
Для добавления поля в индекс используется директива index.
Для создания поля связывающего создаваемую таблицу с другой (связь одно ко многому) указывается директива
модель1:references (или belongs_to в модель2:references), такая директива аналогична модель_id:integer:index
В Rails 5x индекс создается если в миграции установлено foreign_key: true, то есть index_true: true не требуется)
railg g migration CreateJoinTableТаблица1sТаблица2s модель1 модель2
Миграции для создания таблиц также создаются при генерации модели или scaffold. Синтаксис определяющий параметры соответствующих полей таблицы (index, refernces и т.п.) аналогичен описанному выше.
railg g migration AddПолеToТаблицаs поле:тип
или с добавлением поля в индекс
railg g migration AddПолеToТаблицаs поле:тип:index
railg g migration RemoveПолеFromТаблицаs поле:тип
rails g migration AddIndexToUsers name:string:index
rails g migration AddOrganizationsToOrganizations parent:belongs_to
В сгенерированной миграции
class AddOrganizationsToOrganizations < ActiveRecord::Migration[5.1]
def change
add_reference :organizations, :parent, table: :organizations, index: true
add_foreign_key :organizations, :organizations, column: :parent_id
end
end
Создать пустую миграцию
rails g migration ИмяМиграции
В файл миграции добавляем соответствующую директиву
def change
enable_extension :расширение
end
Внутри файла миграции в методе change можно использовать предопределённые методы (create_table, add_index и т.д.) с помощью которых Rails может как поднять миграцию, так и откатить ее.
Если предопределенных методов недостаточно, можно использовать чистый SQL, помещаемый в метод reversible (внутри которого используются методы up и down) или как раньше в методы up и down.
Cоздать пустую миграцию
rails g migration ИмяМиграции
Внести изменения в файле миграции
def change
reversible do |dir|
dir.up do
execute 'SQL код миграции'
end
end
reversible do |dir|
dir.down do
execute 'SQL код отмены миграции'
end
end
end
При этом произвольный код SQL выполняется с помощью метода execute.
Также надо учитывать, что при использовании чистого SQL в миграции, вместо ruby файла схемы (файл из которого создается база для нового приложения) необходимо использовать SQL файл схемы (см. файл ./config/application.rb).
rake --tasks
rails g task пространство имя
rails db:migrate RAILS_ENV=test
Каждое выполнение миграции меняет схему ./db/schema.rb (менять файл вручную не следует), которая используется при разворачивании базы данных приложения при его установке (при выполнении rails db:load).
Если миграции содержат специфический для СУБД команды SQL, которые не могут выполнены с помощью DSL миграций, указав в файле ./config/application.rb можно сказать приложению вместо использования schema.rb с кодом ruby, поддерживать файл схемы в формате SQL – structure.sql
config.active_record.schema_format :sql
rails db:migrate
rails db:migrate:up VERSION=версия
или
rails db:migrate:down VERSION=версия
rails db:migrate VERSION=0
rails db:migrate VERSION=версия
rails db:version
rails db:rollback
rails db:rollback STEP=количество
rails db:seed
rails db:purge
rails db:drop
rails db:drop
rails db:migrate
rails db:reset
rails db:setup
rails db:load
Создать тестовую базу из схемы (требуется для выполнения тестов srspec)
rails db:test:load
До версии Rails 4.1 использовалась команда rake db:test:prepare, которая проверяла имеются ли не выполненные миграции и после этого загружала схему (с rails 4.1 изменения схемы отслеживаются автоматически)