Вы можете получить доступ ко всем своим моделям в рамках миграции и, таким образом, обрабатывать все ваши миграции данных прямо там же. Если вы уже знали это, и ваш вопрос касался более аккуратного способа сделать это, то, конечно, это не тот ответ, который вы ищете.
Одной из проблем вашего примера является то, что вы не можете перейти на более раннюю версию, но только из-за функции блокировки, которую вы демонстрируете в конверсиях.
Я признаю, что ваш пример хорош и лаконичен, но вот обычный пример миграции в любом случае:
class FooBar < ActiveRecord::Migration
def self.up
# This is only needed if the new table will have the same name.
# Move the old one aside.
rename_table :users, :old_users
# The new table structure
create_table :users do |t|
t.string :full_name
t.date :age
end
# Data migration
OldUsers.all.each do |orig|
User.create!(
:full_name => orig.name,
:age => (Date.today - orig.dob)/60/60/24/365
)
end
# Clean up
drop_table :old_users
end
def self.down
# Exercise for the reader!
end
end
# Temporary class for accessing the old table during conversion
class OldUsers < ActiveRecord::Base; end