Розширені міграції

Міграція, призначена для таблиці записів товарів (line i tem) з дущего розділу, може здивувати дублікатами фрагментів оператора execute, вірне, було б краще винести створення обмежень зовнішнього ключа в о ний допоміжний метод.
Розширені міграціїЦе можна зробити, додавши до вихідного файлу міграції наступний
def self.foreign_key (from_table, from_column, to_table) constraint_name = “fk_ # (from_table) _ # (from_column)”
execute% (alter table # (from_table)
add constraint # (constraint_name) foreign key (# (from_column)) references # (to_table) (id))
end
(Необхідність префікса self обумовлена тим, що міграція запус у вигляді методів класу, і нам необхідно викликати метод foreign_key в контексті.)
Тепер ми можемо викликати цей новий метод всередині міграційного методу up: self.up
create_table … do end
foreign_key (: line_iterns,: product_id,: products) foreign_key (: line_iterns,: order_id,: orders)
Можна, звичайно, піти ще далі і зробити метод forei gn_key доступним всіх наших міграцій. Для цього потрібно створити модуль в належному Ежені каталозі lib і додати в нього метод forei gn_key. Але тепер, разу-це має бути звичайний метод примірника, а не метод класу.
lie MigrationHelpers
def foreign_key (from_table, from_column, to_table)
constraint_name = “fk_ # (from_table) _ # (from_column)”
execute% (alter table # (from_table)
add constraint # (constraint_name) foreign key (# (from_column)) references # (to_table) (id))
end
Тепер все це можна додати до будь-якої міграції, включивши в початок файлу f аввграціі наступні рядки коду:Розширені міграції
require “migration_helpers” class CreateLineltems <ActiveRecord:: Migration extend MigrationHelpers
У рядку requi re в код міграції вноситься визначення модуля, а в рядку extend в міграцію як метод класу додаються методи з модуля ItfgrationHelpers. Цю технологію можна використовувати для розробки і з-іместного використання будь-якої кількості допоміжних методів, призначених для міграцій.
(А якщо ви хочете зробити життя ще легше, то для вас вже написані зовнішні вюяулі1, які справляються з додаванням обмежень зовнішнього ключа авто-ввтіческі.)

У чому полягають слабкі сторони міграцій

Міграції страждають від однієї серйозної проблеми. Що лежать в їх основі DDL-оператори, оновлюються схему бази даних, не володіють властивостями транзакції. Rails тут ні до чого – більшість У чому полягають слабкі сторони міграційбаз даних просто не підтримують відкати create table, alter table та інших DDL-інструкцій.
Розглянемо міграцію, за допомогою якої робиться спроба додати до I даних дві таблиці.
class ExampleMigration <ActiveRecord: Migration
def self.up
create_table: one do … end
create_table: two do … end
end
def self.down
drop_table: two drop_table: one
end
end
При нормальному розвитку подій метод up додасть таблиці onentwo.ai тод down їх видалить.
А що, якщо зі створенням другої таблиці виникнуть проблеми? Вийде, ч в базі даних з’явиться таблиця one, але не буде таблиці two. Ми можемо <витися з будь-якою проблемою, що виникла за допомогою міграції, але в даному сд ми не зможемо її застосувати – якщо ми спробуємо це зробити, то потерпимо i ско, оскільки таблиця one вже існує.
Ми можемо спробувати здійснити відкат міграції, але з цього теж i не вийде: оскільки сама міграція цілком не спрацювала, версія схеми! зи даних не пройшла оновлення, тому Rails не буде здійснювати пої її відкату. У такій ситуації ви могли б залишити подібні спроби, брешу змінити інформацію про схему і видалити таблицю one. Але, напевно, так. не варто. За таких обставин ми рекомендуємо просто У чому полягають слабкі сторони міграційвидалити всю (даних, створити її заново і застосувати до неї існуючі міграції, дящіе її до необхідного на даний момент стану. Ви нічого не поті і будете знати, що маєте схему, збудовану в послідовності версій.;
Всі ці розмови наводять на думку, що міграції небезпечно застосовувати до <даних у вже працюючому програмному продукті. Я раджу перед застосований міграцій як мінімум створювати резервну копію бази даних, що знаходяться в експлуатації. Як застосовувати міграції до робочих баз даних, Вам пр ит досліджувати самостійно – цієї теми я більше стосуватися не хочу.

Розробка та тестування RoR ©2010-2014