Ruby on rails 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
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 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