Есть ли какие-либо драгоценные камни/библиотеки Ruby, которые помогают Вам мигрировать от старой структуры DB до новой структуры? Миграции ActiveRecord делают хорошее задание, отслеживающее новой структуры дб, но интересно, существует ли что-то, что помогает Вам переместить весь дб прежней версии в новую структуру:
transfer_from(:source_table => 'person', :destination_table => 'dudes_and_dudets') do
from :name, :to => :full_name
from :dob, :to => :age do |dob| # this would, for example, load the result
(Date.today - dob)/60/60/24/365 # of the block into :age
end
end
(Я понимаю, что Вы могли сделать эти преобразования столь же легко с AR, но я надеюсь, что волшебная библиотека имела бы намного больше, преобразовывает.
Berns
Я начал над этим работать.
Если кто-нибудь захочет дать совет по поводу лучшей / более идиоматической или более эффективной реализации, пожалуйста, дайте мне знать.
http: // github.com / btelles / legacy_migrations
edit :
Теперь у меня есть этот точный синтаксис, работающий над указанным выше репозиторием github ... планирую добавить несколько задач rake для сопоставления старой структуры с новыми классами ActiveRecord и многое другое трансформируется ... в случае, если кому-то интересно.
Это также на gemcutter / rubygems: gem install legacy_migrations
rake db:schema:dump
Вы можете получить доступ ко всем вашим моделям из миграции и, таким образом, обрабатывать все миграции данных прямо там. Если вы уже знали это, и ваш вопрос был о более аккуратном способе сделать это, то, конечно, это не тот ответ, который вы ищете.
Одна из проблем вашего примера заключается в том, что вы не можете мигрировать вниз к более ранней версии, но только из-за возможности блока, которую вы демонстрируете в конверсиях.
Я признаю, что ваш пример красив и краток, но вот пример обычной миграции в любом случае:
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
Мне пришлось сделать что-то вроде (что я думаю) вы описываете, и я использовал для этого Sequel . Sequel легко адаптируется и в целом полезен, может работать с SQL напрямую в довольно удобной форме и может обращаться к различным типам баз данных.
Документация очень удобна, и я полностью ее рекомендую.
Вот пример использования сиквела, чтобы взять огромный произвольно плоский файл из geonames и использовать его для заполнения базы данных и выполнения запросов. Вероятно, это хороший пример того, как заставить что-то делать то, что вы хотите.
Это рельсы-агностик. не нужно прикреплять к модели, миграции или чему-либо еще, кроме пары драгоценных камней.
Существует довольно много способов перемещения баз данных без преобразований. Я помню, как ребята из Rails Envy говорили об одном самоцвете (но это было давно, и у меня нет времени копаться). Загляните на railsenvy.com?
.