02:35 Детально о миграциях. Создание таблиц. Добавление полей. |
Как уже было сказано в статье Миграции. Что такое миграции? после создания миграции, в ней присутствует всего два метода - self.up i self.down. Первый вызывается при выполнении текущей миграции в рамках проведения всех миграций (rake db:migrate), второй срабатывает когда делается откат текущей миграции.
Соответственно метод 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 - Для удаление индекса указываем таблицу и имя поля |
|