【问题标题】:Rails migration : Change column type and update existing dataRails 迁移:更改列类型并更新现有数据
【发布时间】:2019-07-14 21:34:48
【问题描述】:

在我的 Rails 项目中,我有一个模型对象,它有一个名为“永久”的现有列,类型为“布尔”。我需要将此列更改为可能值为 1、2、3 的整数。我有什么方法可以更新数据库中的现有数据(通过 rails 迁移),以便所有“永久”为 false 的行都是更改为 1 并且所有 'permanent' 为 true 的行都更改为 2。

【问题讨论】:

  • 您使用的是哪个 SQL 数据库?

标签: ruby-on-rails database rails-migrations


【解决方案1】:

我正在使用 Postgres。不确定此解决方案是否适用于其他数据库。 以 people 表为例 - 不要忘记将表名更改为您自己的。

  def up
    change_column :people, :permanent, 'integer USING CAST(permanent AS integer)'
    Person.connection.execute("UPDATE people SET permanent = CASE permanent WHEN 0 THEN 1 WHEN 1 THEN 2 END")
  end

  def down
    Person.connection.execute("UPDATE people SET permanent = CASE permanent WHEN 1 THEN 0 WHEN 2 THEN 1 END")
    change_column :people, :permanent, 'boolean USING CAST(permanent AS boolean)'
  end

【讨论】:

  • 以上可以通过rake任务来完成。使用 SQL 查询来执行此类操作总是更好。
  • @ray 感谢您的建议!为什么对此类操作使用 SQL 查询更好?
  • 写迁移的实际动机是使用ActiveRecord::Migration方法,这里execute方法会更好地运行SQL来更新现有数据。否则我也可以在控制器中运行迁移,例如ActiveRecord::Migration.create_table.. if condition
  • 也许您的回答不会造成伤害并且会正常工作,就像您提供了正确的 down 方法并处理得很好一样。但它不满足编码约定。
  • @ray - 我根据你的 cmets 更新了解决方案,现在是否满足编码约定?
猜你喜欢
  • 1970-01-01
  • 2020-06-09
  • 2013-07-27
  • 2021-08-25
  • 2011-02-17
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多