复制 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
我有一个 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 迁移语法。
这个
这里不适合使用迁移。迁移是为了调整数据库结构;它们不用于插入、删除或修改记录。
您可能想要使用 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