您好我有一个sqlite3数据库,其中包含我之前版本的Web应用程序中的数据,而这些数据不是用rails编写的。我现在从头开始在rails中重写web应用程序。但我想在新的rails应用程序中使用我以前的应用程序中的数据。什么是实现这一目标的最佳方式?
这是我到目前为止所尝试过的,并且效果不佳: 1)我创建了一个新的rails应用程序
2)用旧应用程序中的sqlite3数据库替换新应用程序中的sqlite3数据库
3)创建了一个与旧数据库具有相同模式的模型。
4)使用更新的DB文件详细信息更改了databse.yml文件
5)我的模型添加了“establish_connection”方法
6)我可以让它在我的浏览器@“index.html”中向我展示旧数据库的所有细节
7)但是,当想要在DB中插入/编辑记录时,我遇到了问题。由于DB没有每行的主键列,因此无效。
8)所以我尝试进行迁移以添加带主键的列。它没有工作
9)突然在应用程序中出现了一个新的development.sqlite3数据库,它正在尝试向新数据库添加主键。
10)所以我刚刚删除了弹出的新数据库,之后该应用程序无法运行
11)现在我想从头开始,所以我的问题: “将数据从以前的非rails应用程序(以sqlite3数据库格式)导入到新的rails应用程序中的最佳方式是什么”
答案 0 :(得分:5)
您希望使用2个数据库,旧数据库和新数据库。因此,您的database.yml需要有2个连接。一个应该是您正常的连接,称为开发或生产,另一个应该称为遗留。填写不同的连接信息。默认情况下,ActiveRecord模型将从未被称为遗留的模型中拉出。
创建一个名为LegacyBase的模型。在模型中放establish_connection "legacy"
。现在在app / models / legacy中创建一个目录。将所有模型表示来自此目录中旧数据库的数据。所有这些模型都应该从LegacyBase扩展。这意味着他们都是从旧数据库中读取的。
创建新模型。你想让他们有一个主键列吗?如果没有,请参阅此答案。 Create an ActiveRecord database table with no :id column?。默认情况下,它们会有一个id列,我建议保留它。
对于每个遗留模型,编写一个名为to_model的方法。在此方法中,编写创建新对象的代码并使用旧数据填充它并保存。像这样:
class OldUser < LegacyBase
establish_connection "legacy"
def to_model
User.create!(self.attributes)
end
end
您可以执行任何必要的逻辑,以使旧数据适合您的新应用。在OldUser.all.map(&:to_model)
等所有旧记录上调用此方法。
对要移动的所有表执行此操作。