Rails 迁移 - 根据条件修改行

kan*_*008 4 ruby ruby-on-rails rails-migrations

我需要使用 RAILS 迁移更新数据库中的表数据。

Sample:
Table: Table_A(Col_A(number), Col_B(varchar),...)
Query: UPDATE Table_A SET Col_B = "XXX" where Col_B = "YYY"
Run Code Online (Sandbox Code Playgroud)

使用 RAILS 迁移来执行此操作的最佳方法是什么?我什至不确定 RAILS 迁移是否是更新数据库中数据的方法。任何解释都会有帮助。

soc*_*onk 6

通常最好在 rake 任务中执行此类大数据更新。我通常编写它们,以便它们有两个版本:rakechange_lots_of_data:report和rakechange_lots_of_data:update。“报告”版本仅执行 where 子句并输出将更改的内容的列表。“更新”版本使用完全相同的 where 子句,但进行了更改。

这样做的一些优点是:

  • 保存迁移以更改数据库结构
  • 您可以根据需要多次运行“报告”版本,以确保更新正确的记录。
  • 对 rake 任务调用的类进行单元测试更容易。
  • 如果您需要应用相同的标准再次进行更改,您只需再次运行 rake 任务即可。通过迁移来做到这一点是可能的,但比较棘手。


Ric*_*own 5

我更喜欢在 rake 任务中进行任何数据库数据更改,所以就是这样

  1. 明显的
  2. 可重复
  3. 稍后不会通过执行rake db:migrate

代码:

namespace :update do
  desc "Update table A to set Col_B to YYY"
    task :table_a => :environment do
      TableA.where(Col_B: "YYY").update_all(Col_B: "XXX")
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

然后就可以rake update:table_a执行更新了。