让我们说我做了Image.column_names并显示了所有列,例如post_id 但是如何检查post_id是否有索引呢?
答案 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