Как уже было сказано в статье Миграции. Что такое миграции? после создания миграции, в ней присутствует всего два метода - self.up i self.down. Первый вызывается при выполнении текущей миграции в рамках проведения всех миграций (rake db:migrate), второй срабатывает когда делается откат текущей миграции.
Соответственно метод self.down нейтрализирует все то что было сделано методом self.up. Если мы в self.up добавляем новое поле то в self.down мы его должны удалить, если создаем таблицу - то при откате должны ее удалить, если переимнновываем или меняем тип поля, то при откате все должно вернутся на круги своя.
Тепер детально рассмотрим какие действия мы можем делать с БД в текущих методах. Сначала начнем с более простых действий, а закончим более сложными.
Условимся, что работать ми будем с таблицей пользователей, соответственно модель - User. Я буду попарно давать действия и противодействия (для отката).
Соответственно метод self.down нейтрализирует все то что было сделано методом self.up. Если мы в self.up добавляем новое поле то в self.down мы его должны удалить, если создаем таблицу - то при откате должны ее удалить, если переимнновываем или меняем тип поля, то при откате все должно вернутся на круги своя.
Тепер детально рассмотрим какие действия мы можем делать с БД в текущих методах. Сначала начнем с более простых действий, а закончим более сложными.
Условимся, что работать ми будем с таблицей пользователей, соответственно модель - User. Я буду попарно давать действия и противодействия (для отката).
Добавление нового поля
def self.up
add_column :users, :name, :string
end
Сначала указывается таблица, далее указывается имя поля, потом указывается его тип. Весь список используемых типов можно посмотреть в моей статье: Типы данных в миграциях для разных СУБД
Удаление нового поля
def self.down
remove_column :users, :name
end
Сначала указываем таблицу, потом имя поля которое нужно удалить
Переименование колонок
def self.up
rename_column :users, :name, :user_name
end
Указывается сначала таблицу, потом старое имя поля, потом новое имя поля
Обратное переименование колонок
def self.down
rename_column :users, :user_name, :name
end
для отката достаточно вызвать то же метод, только поменять поля местами
Изменение типа поля
def self.up
change_column :users, :age, :integer
end
Указывается сначала имя таблицы, потом имя поля, потом его новый тип
Обратное изменение имя поля
def self.down
change_column :users, :age, :string
end
Для обратного изменения достаточно указать старый тип. Но иногда бывает так, что нада заблокировать возможность отката, например если у нас логика приложения будет жестко привязана к тому что тип поля целый. Тогда в Рельсах используется специальная конструкция которая запрещает откат даной миграции:
def self.down
raise ActiveRcord::IrreversibleMigration
end
Следующим большим разделом будут - Таблицы
Создание таблицы
def self.up
create_table :users, * do |table|
table.column :name, :string, **
table.column :age, :integer
end
end
* - здесь могут указыватся дополнительные опции для создания таблицы:
:force=>true/false - удалать таблицу если уже существует таблица с таким именем
:temporary=>true/false - промежуточная таблица(существует до дисконекта с базой)
:option=>"same opions", например: "auto_increment = 25" - дополнительные SQL опции
:primary_key=>:field_name - если нада задать имя поля отличное от дефолтного ID
:id=>false - если нужно создать таблицу без первичного ключа
** - здесь и в конце каждого объявления поля могут быть дополнительные опции:
:null => true/false - признак того, может ли поле быть null
:limit => field size - максимальный размер поля
:default => default value - значение поля по-умолчанию
В table.column указывается имя поля, тип поля
Удаление таблицы
def self.down
drop_table :users
end
Тут я думаю все понятно :)
Создание/удаление индексов
add_index :users, :name - Для создания индекса указываем таблицу и имя поля
remove_index :user, :name - Для удаление индекса указываем таблицу и имя поля
def self.up
add_column :users, :name, :string
end
Сначала указывается таблица, далее указывается имя поля, потом указывается его тип. Весь список используемых типов можно посмотреть в моей статье: Типы данных в миграциях для разных СУБД
Удаление нового поля
def self.down
remove_column :users, :name
end
Сначала указываем таблицу, потом имя поля которое нужно удалить
Переименование колонок
def self.up
rename_column :users, :name, :user_name
end
Указывается сначала таблицу, потом старое имя поля, потом новое имя поля
Обратное переименование колонок
def self.down
rename_column :users, :user_name, :name
end
для отката достаточно вызвать то же метод, только поменять поля местами
Изменение типа поля
def self.up
change_column :users, :age, :integer
end
Указывается сначала имя таблицы, потом имя поля, потом его новый тип
Обратное изменение имя поля
def self.down
change_column :users, :age, :string
end
Для обратного изменения достаточно указать старый тип. Но иногда бывает так, что нада заблокировать возможность отката, например если у нас логика приложения будет жестко привязана к тому что тип поля целый. Тогда в Рельсах используется специальная конструкция которая запрещает откат даной миграции:
def self.down
raise ActiveRcord::IrreversibleMigration
end
Следующим большим разделом будут - Таблицы
Создание таблицы
def self.up
create_table :users, * do |table|
table.column :name, :string, **
table.column :age, :integer
end
end
* - здесь могут указыватся дополнительные опции для создания таблицы:
:force=>true/false - удалать таблицу если уже существует таблица с таким именем
:temporary=>true/false - промежуточная таблица(существует до дисконекта с базой)
:option=>"same opions", например: "auto_increment = 25" - дополнительные SQL опции
:primary_key=>:field_name - если нада задать имя поля отличное от дефолтного ID
:id=>false - если нужно создать таблицу без первичного ключа
** - здесь и в конце каждого объявления поля могут быть дополнительные опции:
:null => true/false - признак того, может ли поле быть null
:limit => field size - максимальный размер поля
:default => default value - значение поля по-умолчанию
В table.column указывается имя поля, тип поля
Удаление таблицы
def self.down
drop_table :users
end
Тут я думаю все понятно :)
Создание/удаление индексов
add_index :users, :name - Для создания индекса указываем таблицу и имя поля
remove_index :user, :name - Для удаление индекса указываем таблицу и имя поля
Привет, очень помогла твоя статья, информацию по данной теме, если не владеешь англ., найти трудно. Но есть маленькие замечания:
ОтветитьУдалитьнапример в строке "remove_index :users, :name", :users - это не наименование модели, как вы пишите, а наименование таблицы, которое по умолчанию отличается от наименования модели (класса модели) множественной формой. Спасибо.