2015-02-07 81 views

回答

17

在ActiveRecord「連接適配器」類之一上有一個index_exists?方法。

您可以使用它像這樣:

Image.connection.index_exists? :images, :post_id 
+5

即使在':id'屬性的情況下,它總是返回'false'。我做了什麼錯誤的'Referral.connection.index_exists? :引薦,:ID'? – kamal 2016-08-17 10:45:57

+0

@kamal'index_exists?'檢查列上是否存在任何索引。不知道如何檢查,但對我而言,它有時也會返回錯誤。還有[index_name_exists?](http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-index_name_exists-3F)通過名稱檢查索引,它對於自定義索引很有效 – ololobus 2016-08-25 11:35:02

+0

@ ololobus但是這個方法'index_name_exist?'需要通過索引名來知道,這很難知道,因爲你甚至不知道索引是否有索引,或者你實際上正在尋找索引。 – kamal 2016-08-26 12:01:00

1

以下爲我工作:

ActiveRecord::Base.connection.index_exists?(:table_name, :column_name) 
4

正如其他人所說,你可以使用以下方法來檢查,如果該列存在索引:

ActiveRecord::Base.connection.index_exists?(:table_name, :column_name) 

但值得注意的是,只有當索引存在索引時才返回true該列和僅該列。如果您使用包含列的複合索引,它將不會返回true。你可以用

ActiveRecord::Base.connection.indexes(:table_name) 

看到所有索引的表如果你看看源代碼index_exists?,你會看到,在內部它使用indexes弄清楚是否存在索引。所以,如果像我一樣,他們的邏輯不適合你的用例,你可以循環這些索引,看看他們中的一個是否可以工作。在我的情況下,邏輯是這樣的:

ActiveRecord::Base.connection.indexes(:table_name).select { |i| i.columns.first == column_name.to_s}.any? 

同樣重要的是要注意,indexes不返回自動Rails爲ID的指數,這也解釋了爲什麼有些人以上都不必index_exists?(:table_name, :id)

與調用問題