是否有任何Ruby gems /库可以帮助您从旧的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的
答案 0 :(得分:3)
我已经开始研究这个了。
如果有人想提供有关更好/更具惯用性或更高效实施的提示,请告诉我们。
http://github.com/btelles/legacy_migrations
修改:
我现在已经在上面的github存储库中使用了这个确切的语法...计划添加一些rake任务,用于将旧结构映射到新的ActiveRecord类,以及更多变换......以防任何人感兴趣。
它也在gemcutter / rubygems上:gem install legacy_migrations
答案 1 :(得分:2)
您可以从迁移中访问所有模型,从而也可以处理所有数据迁移。如果您已经知道这一点,并且您的问题是关于更简洁的方式,那么当然这不是您正在寻找的答案。
您的示例存在的一个问题是,您无法迁移到早期版本,只是因为您在转化过程中展示了阻止功能。
我承认你的例子很好而且简洁,但这里有一个常规的迁移示例:
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
答案 2 :(得分:1)
我必须做一些你正在描述的事情(我认为),并且我使用了Sequel。续集具有适应性和通用性,可以直接以相当方便的方式使用SQL,并且可以访问多种不同类型的数据库。
文档非常方便,我完全推荐它。
Here's an example使用续集从geonames获取一个巨大的任意flatfile并使用它填写数据库并进行查询。这可能是一个很好的例子,你可以做一些你想做的事情。
这是与轨道无关的。不需要附加到模型,迁移或除了几个宝石之外的任何其他东西。
答案 3 :(得分:0)
有很多移动数据库没有转换。我记得Rails嫉妒的家伙正在谈论一个宝石(但它已经有一段时间了,我没有时间去挖掘)。看看railsenvy.com?
答案 4 :(得分:0)
查看Trucker Gem,它非常适合将旧数据迁移到Rails应用程序中。它为遗留数据库中的每个表创建活动记录对象,并将它们放入app / models / legacy中。在这些类中,您可以定义它们映射到新类的方式。
答案 5 :(得分:-1)
rake db:schema:dump