使用postgresql迁移后,schema.rb不包含add_index方法

时间:2014-09-11 20:58:41

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

所以我试图在Users模型的email列上创建一个数据库索引,但我一定做错了,因为在我进行迁移之后我去检查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并查看是否有一些&#34; magic&#34;发生但我甚至无法回滚,收到此错误消息:

   ==  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所以我希望有经验的人可以给我一个提示。

非常感谢!

2 个答案:

答案 0 :(得分:0)

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

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

我认为表中必须查找的索引信息位于迁移文件中。所以我删除了迁移文件的内容,如下所示:

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

非常感谢所有花时间阅读此问题的人!

答案 1 :(得分:0)

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

您(我们)在保存迁移文件之前使用了migrate命令!!因此迁移过程中没有任何内容。只是一个没有说明的改变方法。

如果您尝试回滚并且之后保存了迁移文件。 add_index指令在,因此无法回滚。

我希望我足够清楚。