复制 rails table 并在迁移中更改数据

copy rails table with changed data in migrations

我有一个 table 神秘的披萨,目前看起来像这样

|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    |

基本上我只是想复制 table 的数据,然后将其粘贴回相同的 table,但略有不同。更糟糕的是,我在 rails.

的 ruby 表现糟糕

我试过了,但我就是想不出复制 table,然后用更改后的数据粘贴 table 的语法。更糟糕的是,我的测试站点在 sqlite 中,而我的生产服务器在 MYSQL 中。所以我不能只写一个它必须使用 ruby 迁移语法。

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

这里不适合使用迁移。迁移是为了调整数据库结构;它们不用于插入、删除或修改记录。

您可能想要使用 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控制台/脚本:

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

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

我使用了一些我注意到的堆栈溢出问题,这就是我想出的。不过我最终还是使用了迁移,而且效果很好。

def up        
    Foo.find_each do |a|
      a.mystery_id = 1
      a.save!
    end

    Foo.all.each do |a|
      foo = foo.new(
        :name => a.name,
        :name => a.description,
        :mystery_id => 2
      )
      reminderEvent.save!
    end
  end

  def down

    TODO: somehow remove half all with mystery_id = 2
  end