2015-02-07 71 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)

与调用问题