复制rails表,其中包含迁移中已更改的数据

时间:2016-06-22 16:46:00

标签: mysql ruby-on-rails ruby sqlite rails-migrations

我有一张与神秘相关的表披萨,目前看起来像这样

|pizza_id|mystery_id|name|description|
|1       |1         |fun |really fun |
|2       |1         |car |it is fast |
|3       |1         |hou |i live!    |
|4       |1         |air |breathy    |

在我迁移之后,我希望它看起来像这样:

|pizza_id|mystery_id|name|description|
|1       |1         |fun |really fun |
|2       |1         |car |it is fast |
|3       |1         |hou |i live!    |
|4       |1         |air |breathy    |
|5       |2         |fun |really fun |
|6       |2         |car |it is fast |
|7       |2         |hou |i live!    |
|8       |2         |air |breathy    |

基本上我只想复制表的数据,然后将其粘贴回同一个表中,但略有不同。更糟糕的是,我在轨道上看到红宝石。

我试过了,但我只是想弄清楚复制表格的语法,然后用更改的数据粘贴表格。更糟糕的是我的测试站点是sqlite,我的生产服务器是MYSQL。所以我不能只写一个或者它必须使用ruby迁移语法。

这个stackoverflow question看起来很有用,但是它正在复制到另一个表中,它只使用ruby而不是ruby迁移在迁移中是合法的吗?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

迁移不是在这里使用的正确选择。迁移用于调整数据库结构;他们不会插入,删除或修改记录。

您可能想要使用seeds.db(使用初始数据为数据库播种)或者只是在rails控制台或独立脚本中执行操作。

使用seeds.db:

从空的披萨数据库开始,假设您的Pizza模型包含belongs_to :mystery

Mystery.create({ /* mystery params */ }) // Create mystery 1
Mystery.create({ /* mystery params */ }) // Create mystery 2

pizza_data = [
  { name: 'fun', description: 'really fun' },
  { name: 'car', description: 'it is fast' },
  { name: 'hou', description: 'i live!' },
  { name: 'air', description: 'breathy' },
]

Mystery.all.each do |mystery|
  pizza_data.each do |pizza_params|
    mystery.pizza.create(pizza_params)
  end
end

然后在终端中要运行bundle exec rake db:seed

(有关seeds.rb的更多信息,请参阅http://www.xyzpub.com/en/ruby-on-rails/3.2/seed_rb.html

使用rails console / script:

如果您想使用rails控制台手动执行此操作,并在终端中输入rails c预先存在的披萨行并输入:

Pizza.all.each { |p| Pizza.create(mystery_id: 2, name: p.name, description: p.description) }

答案 1 :(得分:-1)

我使用了一些我注意到的堆栈溢出问题,这就是我提出的问题。我最终确实使用了迁移,但它运行良好。

 async.series([
       function(callback) {
        });
         },
function(callback) {
        async.forEachSeries(temp,function(quest,callback) {

        }, function(err) {
            if (err) return next(err);
        });
        callback();
    }
],
    function(err) { 
        if (err) return next(err);
        res.json(output);
});