ruby-on-rails - 如何创建迁移以仅在索引存在时删除索引,而不是在不存在时抛出异常?

标签 ruby-on-rails ruby-on-rails-4 rails-migrations

现在,当前迁移可能会失败,如果 books表没有 created_atupdated_at领域:

class AddTimestampIndexes < ActiveRecord::Migration
  def up
    remove_index :books, :created_at
    remove_index :books, :updated_at

    add_index  :books, :created_at
    add_index  :books, :updated_at
  end

  def down
    remove_index :books, :created_at
    remove_index :books, :updated_at
  end
end

是否remove_index如果无法删除索引而不是引发错误,请采取任何选择静默处理?

最佳答案

您可以使用 index_exists?迁移中的方法来测试您需要删除的索引是否确实存在。

看看这里的文档:
http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/index_exists%3F

我还没有测试过,但你应该能够使用这样的东西:

class AddTimestampIndexes < ActiveRecord::Migration
  def up
    remove_index :books, :created_at if index_exists?(:books, :created_at)
    remove_index :books, :updated_at if index_exists?(:books, :updated_at)

    add_index  :books, :created_at
    add_index  :books, :updated_at
  end

  def down
    remove_index :books, :created_at
    remove_index :books, :updated_at
  end
end

虽然,从表面上看,你真的只想在它们不存在的情况下创造它们?
这可能更适合您的迁移:
class AddTimestampIndexes < ActiveRecord::Migration
  def up
    add_index  :books, :created_at unless index_exists?(:books, :created_at)
    add_index  :books, :updated_at unless index_exists?(:books, :updated_at)
  end

  def down
    remove_index :books, :created_at
    remove_index :books, :updated_at
  end
end

关于ruby-on-rails - 如何创建迁移以仅在索引存在时删除索引,而不是在不存在时抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21795023/

相关文章:

ruby-on-rails - 我可以使用 ActiveRecord 迁移向表或列添加注释吗?

javascript - Rails - Turbo - 链接预加载但在窗口加载事件后几秒钟内未使用

javascript - jquery 添加跨度整数值不起作用

ruby-on-rails - 通过单行命令创建模型和索引?

ruby-on-rails - 迁移数据 - 不仅仅是模式,Rails

ruby-on-rails - 使用 ActiveSupport::Concern 的 Rails mixin 不起作用

ruby-on-rails - Ruby on Rails 与 self 的多对多关系

javascript - 为客户端 MV* 框架提供无 js 回退

ruby-on-rails - ExecJS CoffeeScript 未显示编译错误的行号(Rails Assets 管道)

heroku - 设备无法在 Heroku 服务器上运行