提交 ecfce561 编写于 作者: Y Yves Senn

`index_exists?` with `:name` checks specified columns.

[Yves Senn & Matthew Draper]

The column check was embodied in the defaul index name.
If the :name option was used, the specified columns were not verified at all.

Given:

```
assert connection.index_exists?(table_name, :foo_id, :name => :index_testings_on_yo_momma)
```

That index could have been defined on any field, not necessarily on `:foo_id`.
上级 82e28492
* `index_exists?` with `:name` option does verify specified columns.
Example:
add_index :articles, :title, name: "idx_title"
# Before:
index_exists? :articles, :title, name: "idx_title" # => `true`
index_exists? :articles, :body, name: "idx_title" # => `true`
# After:
index_exists? :articles, :title, name: "idx_title" # => `true`
index_exists? :articles, :body, name: "idx_title" # => `false`
*Yves Senn*, *Matthew Draper*
* When calling `update_columns` on a record that is not persisted, the error
message now reflects whether that object is a new record or has been
destroyed.
......
......@@ -43,13 +43,14 @@ def table_exists?(table_name)
# index_exists?(:suppliers, :company_id, name: "idx_company_id")
#
def index_exists?(table_name, column_name, options = {})
column_names = Array(column_name)
index_name = options.key?(:name) ? options[:name].to_s : index_name(table_name, :column => column_names)
if options[:unique]
indexes(table_name).any?{ |i| i.unique && i.name == index_name }
else
indexes(table_name).any?{ |i| i.name == index_name }
end
column_names = Array(column_name).map(&:to_s)
index_name = options.key?(:name) ? options[:name].to_s : index_name(table_name, column: column_names)
checks = []
checks << lambda { |i| i.name == index_name }
checks << lambda { |i| i.columns == column_names }
checks << lambda { |i| i.unique } if options[:unique]
indexes(table_name).any? { |i| checks.all? { |check| check[i] } }
end
# Returns an array of Column objects for the table specified by +table_name+.
......
......@@ -95,6 +95,12 @@ def test_index_exists_on_multiple_columns
assert connection.index_exists?(:testings, [:foo, :bar])
end
def test_index_exists_with_custom_name_checks_columns
connection.add_index :testings, [:foo, :bar], name: "my_index"
assert connection.index_exists?(:testings, [:foo, :bar], name: "my_index")
assert_not connection.index_exists?(:testings, [:foo], name: "my_index")
end
def test_valid_index_options
assert_raise ArgumentError do
connection.add_index :testings, :foo, unqiue: true
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册