背景: 有些项目,新旧项目同时维护,当有把旧项目中的数据迁移到新项目的需求的时候,有几个问题 1. 两个项目(A,B)都用同样的数据库 pg,需要在一个项目中写 rake 任务,执行迁移。 2. 要迁移的数据不完全相同(部分相同) 3. 把 A 中的两个表 table_a, table_b 移到 B 中的四张表 table_1,table_2..(因为新项目 B 业务逻辑增加,或者进行了优化,所以要把旧项目的数据导入到新结构中)
目前采用的解决方案: 在新项目 B 中写 rake 任务,把 A 中涉及到的模型拿到 B 中来,为了避免类名冲突,加上了命名空间 --app --models --xx(namespace) --modle_a --modle_b 模型中指定表名,否则会去数据库中找 xx_modle_as 这个表,另外,使用 establish_connection 来链接项目 A 的数据库
class Xx::ClassA < ActiveRecord::Base
self.table_name = "class_as"
establish_connection A_DATABASE
..
end
新建 config/initializers/database_config.rb 文件
db_config = YAML.load_file(File.join(File.dirname(__FILE__), "../database_a.yml"))
if Rails.env.eql?("development")
A_DATABASE = db_config["development"]
else
A_DATABASE = db_config["production"]
end
在 database_a.yml 中添加项目 A 的数据库配置信息
在写 rake 任务的时候,即使项目 A,B 中有相同的类,也不会冲突了
namesapce "prices" do
desc "data migration"
task :migrate => :environment do
ClassA.all
Xx::ClassA.all
end
end
=========================================================== 功能实现了,因为过一段事件以后,还可能再做迁移,这样这部分代码就不能去掉,但是感觉代码变得非常的丑,不知道有没有更好的办法,大神们,第一次提问题,不要让为冷场啊,不知道问题描述清楚了没有,请指教!!!