6

在我schema.rb刪除索引我有以下行:無法從表中軌道4,5和PSQL 9.3

add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree 

當我在psql裏運行\di我得到:

Schema |        Name        | Type | Owner |   Table 
--------+--------------------------------------------------------------+-------+-------+----------------------- 
public | index_users_on_email           | index | alex | users 

然而, ,如果我包含遷移其中之一:

  • remove_index:users,name :: index_users_on_email
  • remove_index:用戶,列:電子郵件
  • remove_index:用戶:電子郵件
  • 執行 'DROP INDEX index_users_on_email'

我收到以下錯誤:

rake aborted! 
An error has occurred, this and all later migrations canceled: 

Index name 'index_users_on_email' on table 'users' does not exist 

我還發現這issue。那麼有什麼想法?

回答

7

如果你想通過名字刪除一個索引,你可以寫這樣的:

remove_index(:table_name, :name => 'index_name') 

你應該看看這個問題還有:What's the correct syntax for remove_index in a Rails 3.1.0 migration?

+0

我已經嘗試通過名稱刪除索引,但得到了相同的結果。我也讀過你提到的問題。但是,無論如何感謝你的努力。 –

+0

您應該手動檢查數據庫以查看索引是否確實存在。 – ChrisBarthol

+0

是的,它確實存在。在psql中運行\ di得到:'public | index_users_on_email | index | alex |用戶' –

5

我知道這是未來非常晚,但我剛碰到類似的東西。在嘗試刪除索引之前,是否有機會將其重命名爲「電子郵件」列?如果是這樣,通過重命名該列,索引將被刪除。因此,爲了將必須:

1)除去指數 2)重命名列

+1

這也是我的問題。我正在刪除一列,然後嘗試刪除包含先前刪除的列的索引。 – Kyril

+0

同樣在這裏。我正在運行一次遷移,刪除了一列,然後刪除索引並得到這個錯誤。開關順序,它的工作。 –

1

一個遲到的回答的有點,但我只是碰到了同樣的問題,所以我寫這封信希望這個答案吧將在未來幫助他人。

原始提問者碰到的issue導致解決方案。看來在Rails 3.x中,的index_name_for_remove有缺陷,所以它有時不接受命名索引。相反,它提出了一個ArgumentError聲稱索引不存在。

在Rails 4.x中,更改了the implementation,以便正確處理傳遞帶索引名稱的散列(我認爲我目前沒有Rails 4應用程序進行測試)。

如果您需要在Rails 3.x中處理此問題,查看remove index的源代碼可以找到解決方案 - 使用remove_index!方法。 remove_index!有兩個參數 - 表名和索引名。所以樓主的問題的情況下,這個命令應該做的工作:

remove_index! :users, :index_users_on_email

更新:發佈我發現樓主問的軌道4的答案,所以它似乎後在某些情況下,index_name_for_remove的執行仍然存在問題,沒有檢測到正確的索引名稱。但是,由於索引的名稱是已知的,我們不需要真正瞭解名稱是什麼(index_name_for_remove在內部是這樣做的),我們仍然可以使用remove_index!方法將其刪除。