Ruby on rails Rails Postgres迁移无需停机

Ruby on rails Rails Postgres迁移无需停机,ruby-on-rails,postgresql,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 <&

假设我想在运行以下迁移的
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
class AddVersionHistoryToUsersuser.versions总结一下:为每个
用户循环和查询数据库是非常低效的。您应该为这些任务使用

因为您的数据已经存在于同一个表中,所以您可以从那里简单地获取它

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

总而言之:为每个
用户
循环和查询数据库是非常低效的。您应该为这些任务使用

因为您的数据已经存在于同一个表中,所以您可以从那里简单地获取它

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

纯sql似乎更适合您的任务,而且还不清楚您试图在rails级别上实现的是什么—使用before_save hook并从服务器命令行手动运行迁移(bundle exec rake db:migrate)@TheCha͢mp我正在创建一个新列来保存用户应用程序版本的历史记录,并在每次版本更改时更新它,因此我正在将
user.versions
的值初始化为当前版本,如果有任何问题,我的答案现在可以用纯sql似乎更适合您的任务,现在还不清楚你想在rails级别上实现什么,使用before_save hook,并从服务器命令行手动运行迁移(bundle exec rake db:migrate)@TheCha͢mp我正在创建一个新列来保存用户应用程序版本的历史记录,并在每次版本更改时更新它,因此,我正在将
user.versions
的值初始化为当前版本,如果确定,我的答案现在有效,如果锁定问题仍然存在,您可以添加第二次迁移。我看到-W锁定问题已经消失,不必将迁移拆分为2。如果锁定问题仍然存在,您只需添加第二次迁移,我明白了-W锁问题已经消失,不需要将迁移拆分为2。