Skip to content

Commit

Permalink
index_exists? with :name checks specified columns.
Browse files Browse the repository at this point in the history
[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`.
  • Loading branch information
senny committed Aug 13, 2014
1 parent 82e2849 commit ecfce56
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 7 deletions.
16 changes: 16 additions & 0 deletions activerecord/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
* `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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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+.
Expand Down
6 changes: 6 additions & 0 deletions activerecord/test/cases/migration/index_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit ecfce56

Please sign in to comment.