Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails迁移-根据条件修改行_Ruby On Rails_Ruby_Rails Migrations - Fatal编程技术网

Ruby on rails Rails迁移-根据条件修改行

Ruby on rails Rails迁移-根据条件修改行,ruby-on-rails,ruby,rails-migrations,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迁移是否是更新数据库中数据的方法。任何解释都会有帮助。您可以这样做: ActiveRecord::Base.connection.execute("updat

我需要使用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迁移是否是更新数据库中数据的方法。任何解释都会有帮助。

您可以这样做:

ActiveRecord::Base.connection.execute("update Table_A set Col_B = 'XXX'  where Col_B = 'YYY')
 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
或:

class YourMigration
这应该在rake任务中完成

namespace :onetime do
  task :update_my_data => :environment do
    TableA.where(Col_B: "YYY").update_all(Col_B: "XXX")
  end
end
然后在部署之后:

rake onetime:更新我的数据

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


关于
update\u all
方法的更多详细信息:

通常最好在rake任务中进行此类大数据更新。我通常编写它们,所以它们有两个版本:rake change\u lots\u数据:report和rake change\u lots\u数据:update。“report”版本只执行where子句,并列出将要更改的内容列表。“更新”版本使用非常相同的where子句,但进行了更改

这样做的一些好处是:

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

我更喜欢在rake任务中更改任何数据库数据,这样就可以了

  • 明显的
  • 可重复
  • 以后不会通过
    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
    

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

    您错了。表中未提及
    型号
    。在迁移中使用
    模型是不好的。这不是我说“如果您的表有模型”的原因吗???我们怎么知道他的桌子没有模型?我认为在迁移中进行任何类型的大规模更新都是不好的。只需要做一个rake任务。如果表确实有一个与之关联的模型,那么使用execute还是使用上面提到的方法更好。在我看来,仍然使用
    execute
    更好。因为使用模型是危险的。我会说我的版本在rake任务中,在迁移中执行版本。就个人而言,我更喜欢rake任务……我将参考关于为什么使用迁移更改数据不好的前一个问题的第二个答案:在这里完全同意。大数据更新最好留给rake任务来完成。在一次迁移中尝试做这种事情时,我遇到了一些麻烦,之后的迁移会稍微改变数据库结构,导致连续运行的迁移出现爆炸性的失败。我为您解决了这个问题。干杯PS:看起来Stackoverflow不能在一个有序列表之后处理代码,所以中间需要一些文本。
    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