Rails Postgres迁移无需停机

时间:2016-03-23 11:13:43

标签: ruby-on-rails postgresql

我想说我想在我的users表格中添加一列,运行以下迁移

class AddVersionHistoryToUsers < ActiveRecord::Migration
  def change
    add_column :users, :versions, :string, array: true, default: '{}'
    User.find_each do |user|
      if user.app_version?
        user.versions << user.app_version.to_s
        user.save!
      end
    end
  end
end

我的目标是将每个用户的当前app_version插入versions数组。由于默认值,我怎样才能在users表中没有锁定的情况下执行迁移?

1 个答案:

答案 0 :(得分:2)

要打包它:为每个User循环和查询数据库高度效率低下。您应该使用update_all执行这些任务。

由于您的数据已存在于同一个表中,因此您可以从那里获取数据。

User.where.not(app_version: nil).update_all('versions = ARRAY[app_version]')