Навигация
Загрузка данных с помощью миграций
Даже в процессе разработки для всесторонней проверки работоспособности i шинство приложений требуют загрузки в базу значительного объема да ходной информации. Скажем, если создается интернет-магазин, то нужнщ ные о товарах.
Также может понадобиться информация о стоимости доставки, о юг. и т. д. В прежние времена разработчики вынуждены были вводить эти, в базу, зачастую путем ручного набора SQL-операторов insert. Этот трудно поддавался управлению и повторному воспроизводству. Это также: няло вхождение в трудовой ритм разработчиков, присоединявшихся к пр полпути.
Миграции значительно упростили этот процесс. Фактически при ра всех моих Rails-проектов я чаще всего занимался созданием миграций, за щих данные в существующую схему, а не изменяющих ее как таковую, внимание, что здесь идет речь о создании данных, облегчающих труд разр ка по проверке работоспособности приложения, и о создании установоч ных типа справочных таблиц. Что касается тестирования, то в нем все же: воспользоваться стендами, содержащими испытательные данные.
Вот типичная миграция данных, извлеченная из Rails-приложения для нового да Pragmatic Bookshelf. TestDiscounts < ActiveRecord::Migration
def self.up down
Ruby Paper'
rails_book_sku = Sku.find_by_sku("RAIUS-B-00" ) ruby_book_sku = Sku.find_by_sku("RUBY-B-00" ) auto_book_sku = Sku.find_by_sku("AUTO-B-00" ) discount = Discount.create( :name => "Rails +
Automation Sale" DEDUCT_PERCENT" 5.00" )
raction => "DEDUCT_AMOUNT .amount => "15.00" ) discount.skus = [rails_book_sku, ruby_book_sku] di scount.save!
discount = Discount.create( :name =>
.action => :amount => discount.skus = [auto_book_sku] discount.save!
end
def self.down
Di scount.delete_all
end
Заметьте, что миграция использует всю мощь существующих классов Active record для поиска имеющихся единиц учета запасов (SKU — stock-keeping units), •издания новых объектов скидок (discount) и объединения этих двух категорий. Обратите внимание на маленькую хитрость: в самом начале метода up вызывает-«j ыетод down, который удаляет все строки из таблицы di scounts. Для миграций, i работающих с данными, это вполне обычная практика.