我正在使用Rails 4.2.7。我想创建一个支持扩展的迁移,但前提是该扩展在运行我的主机环境中不存在。我创造了

class EnableUuidOsspExtension < ActiveRecord::Migration
  def change
    enable_extension 'uuid-ossp'
  end
end

但我想禁止启用扩展(如果已启用)。如何调整上述迁移以实现此目标?这样做的动机是因为我必须在本地计算机上运行该程序才能将其添加到PostGres,但是如果我迁移到Heroku,此扩展程序可能已经存在,但是我不希望在运行数据库迁移时崩溃脚本。

最佳答案

有一个extensions方法可返回扩展名数组,因此您可以执行以下操作:

def up
  enable_extension('uuid-ossp') unless extensions.include?('uuid-ossp')
end

def down
  disable_extension('uuid-ossp') if extensions.include?('uuid-ossp')
end

您也可以在可以访问 create extension if not exists 的SQL中手动完成此操作:
def up
  connection.execute('create extension if not exists "uuid-ossp"')
end

07-24 09:37