【问题标题】:schema.rb doesnt include add_index method after migration using postgresql使用 postgresql 迁移后 schema.rb 不包括 add_index 方法
【发布时间】:2014-11-05 22:58:02
【问题描述】:

所以我试图在用户模型的电子邮件列上创建一个数据库索引,但我一定做错了,因为在我进行迁移后,我去检查 schema.rb 文件以查看 add_index方法包括在内,没有任何显示。顺便说一句,我正在使用 postgresql。所以这就是我所做的...... 我创建了迁移

rails generate migration add_index_to_users_email

之后,我编辑并保存了 db/migrate/20140911192804_add_index_to_users_email.rb 文件,并使用以下代码进行索引:

class AddIndexToUsersEmail < ActiveRecord::Migration
  def change
    add_index :users, :email, unique: true
  end
end

之后我在控制台上运行

bundle exec rake db:migrate

当我去检查 schema.rb 文件以查看是否包含 add_index 方法时,我发现它不存在。这是我的 schema.rb 的样子

ActiveRecord::Schema.define(version: 20140911192804) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "users", force: true do |t|
    t.string   "name"
    t.string   "email"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

end

我尝试运行 rake db:rollback 以再次运行 db:migrate 并查看是否发生了一些“魔术”,但我什至无法回滚,收到以下错误消息:

   ==  AddIndexToUsersEmail: reverting ===========================================
-- remove_index(:users, {:unique=>true, :column=>:email})
  ←[1m←[35m (0.0ms)←[0m  ROLLBACK
rake aborted!
An error has occurred, this and all later migrations canceled:

Index name 'index_users_on_email' on table 'users' does not existC:in `migrate'
Tasks: TOP => db:rollback

我很迷茫......我发现有趣的是在 schema.rb 文件中的这一行

ActiveRecord::Schema.define(version: 20140911192804) do

与 add_index db/migrate/20140911192804_add_index_to_users_email.rb 的迁移文件具有相同的时间戳

因此,在迁移过程中,schema.rb 文件发生了某种更新,但不是我所期望的。

我什至不知道从哪里开始 :D 所以我希望有经验的人能给我一个提示。

非常感谢!

【问题讨论】:

  • 在您的迁移中,您能否删除 unique: true 并告诉我这是否可行?
  • @Anthony 我刚刚删除了 unique: true 并且 schema.rb 文件仍然没有显示 add_index 方法。
  • 当我运行 rake db:migrate 控制台运行正常,没有显示错误。
  • 我认为您只有另一个迁移,对吗?你的应用在 github 上是偶然的吗?

标签: ruby-on-rails ruby postgresql railstutorial.org rails-migrations


【解决方案1】:

经过数小时的反复试验,我终于找到了解决方案!

由于某些我无法理解的原因,迁移没有将 add_index 方法添加到我的 schema.rb,但是,当我尝试回滚时,它正在寻找用户表中不存在的索引,因此它一直中止回滚。

我假设它必须在表中查找的有关索引的信息在迁移文件中。所以我删除了迁移文件的内容,如下所示:

class AddIndexToUsersEmail < ActiveRecord::Migration
  def change
  end
end

我终于可以回滚了。

然后我再次输入了 AddIndexToUsersEmail 迁移文件中的内容

class AddIndexToUsersEmail < ActiveRecord::Migration
  def change
    add_index :users, :email, unique: true
  end
end

我再次运行 bundle exec rake db:migrate 它奏效了! :D

非常感谢所有花时间阅读本期的人!

【讨论】:

    【解决方案2】:

    我刚遇到同样的问题,找到了原因!!!

    您(我们)在保存迁移文件之前使用了迁移命令!所以迁移通过了,里面什么都没有。只是一种没有说明的更改方法。

    如果在您尝试回滚之后,迁移文件已被保存。 add_index 指令在,所以不能回滚。

    我希望我足够清楚。

    【讨论】:

      猜你喜欢
      • 2013-01-09
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 2017-07-22
      • 2013-02-05
      相关资源
      最近更新 更多