ruby-on-rails - 如何仅在扩展不存在时启用它?

标签 ruby-on-rails database postgresql migration rails-activerecord

我正在使用 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

您也可以在 SQL 中手动完成,您可以访问 create extension if not exists :

def up
  connection.execute('create extension if not exists "uuid-ossp"')
end

关于ruby-on-rails - 如何仅在扩展不存在时启用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39213735/

相关文章:

ruby-on-rails - 在 Rails 5 中破解 RJS 行为

ruby-on-rails - 事件记录导入正在创建重复记录

mysql - 设置 innodb_log_file_size 会使 MySQL 崩溃

c# - 在哪里存储可编辑的配置参数

postgresql - Heroku 下载 pg :backups how to

ruby-on-rails - 直接使用 https ://访问站点博客的重定向 url 时出现 SSL 错误

ruby-on-rails - 没有 Redis 的 Rails 3 A/B 拆分测试系统?

mysql - 如何在 MySQL 中查询以下内容?

python - 将 Pandas 数据帧发送到 SQL 数据库的最佳方法?

postgresql - 如何使用 PostGIS 升级 PostgreSQL?