如何通过rails控制台检查列上是否有索引?

时间:2015-02-07 20:15:18

标签: ruby-on-rails

让我们说我做了Image.column_names并显示了所有列,例如post_id 但是如何检查post_id是否有索引呢?

4 个答案:

答案 0 :(得分:21)

其中一个ActiveRecord“连接适配器”类有一个index_exists?方法。

你可以像这样使用它:

Image.connection.index_exists? :images, :post_id

答案 1 :(得分:10)

正如其他人所提到的,您可以使用以下内容检查列上的索引是否存在:

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自动为ids生成的索引,这就解释了为什么上面的某些人在调用index_exists?(:table_name, :id)

答案 2 :(得分:1)

以下对我有用:

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

答案 3 :(得分:1)

要获取更新的答案,从Rails 3+多列开始,#index_exists?方法中都支持唯一性和自定义名称。

# Check an index exists
index_exists?(:suppliers, :company_id)

# Check an index on multiple columns exists
index_exists?(:suppliers, [:company_id, :company_type])

# Check a unique index exists
index_exists?(:suppliers, :company_id, unique: true)

# Check an index with a custom name exists
index_exists?(:suppliers, :company_id, name: "idx_company_id")

来源:Rails 6 Docs