假设我做了Image.column_names并且显示了所有的列,比如post_id ,但是如何检查post_id是否有索引呢?如何通过导轨控制台检查列上是否存在索引?
12
A
回答
17
在ActiveRecord“连接适配器”类之一上有一个index_exists?方法。
您可以使用它像这样:
Image.connection.index_exists? :images, :post_id
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)
即使在':id'属性的情况下,它总是返回'false'。我做了什么错误的'Referral.connection.index_exists? :引荐,:ID'? – kamal 2016-08-17 10:45:57
@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
@ ololobus但是这个方法'index_name_exist?'需要通过索引名来知道,这很难知道,因为你甚至不知道索引是否有索引,或者你实际上正在寻找索引。 – kamal 2016-08-26 12:01:00