Rails迁移 - 根据条件修改行

时间:2013-03-20 18:00:37

标签: ruby-on-rails ruby 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"

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

5 个答案:

答案 0 :(得分:3)

通常,在rake任务中执行这些类型的大数据更新会更好。我经常写它们,因此它们有两个版本:rake change_lots_of_data:report和rake change_lots_of_data:update。 'report'版本只执行where子句并吐出一个可以更改的列表。 “更新”版本使用完全相同的where子句但进行更改。

这样做的一些好处是:

  • 保存迁移以更改数据库结构
  • 您可以根据需要经常运行“报告”版本,以确保更新正确的记录。
  • 对rake任务调用的类进行单元测试更容易。
  • 如果您需要应用相同的条件再次进行更改,则可以再次运行rake任务。使用迁移可以做到这一点很棘手。

答案 1 :(得分:2)

这应该在rake任务中完成......

namespace :onetime do
  task :update_my_data => :environment do
    TableA.where(Col_B: "YYY").update_all(Col_B: "XXX")
  end
end

然后在部署之后:

rake onetime:update_my_data

在我的公司,我们删除了生产中运行后的一次性命名空间rake任务的内容。我想这只是一个惯例。

有关update_all方法的更多详细信息:http://apidock.com/rails/ActiveRecord/Relation/update_all

答案 2 :(得分:2)

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

  1. 明显
  2. 重复
  3. 以后不会通过rake db:migrate
  4. 执行

    代码:

    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
    

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

答案 3 :(得分:1)

你可以这样做:

 class YourMigration < ActiveRecord::Migration
   def up    
     execute('UPDATE Table_A SET Col_B = "XXX" where Col_B = "YYY"')
   end

   def down
   end
 end

或者:

 class YourMigration < ActiveRecord::Migration
   def up   
     update('UPDATE Table_A SET Col_B = "XXX" where Col_B = "YYY"')
   end

   def down
   end
 end

答案 4 :(得分:0)

ActiveRecord::Base.connection.execute("update Table_A set Col_B = 'XXX'  where Col_B = 'YYY')