Skip to content

Commit 598ecc4

Browse files
committed
Create dummy column name to keep expression-only indexes from colliding in table definition.
Fixes #8
1 parent 802972b commit 598ecc4

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

lib/schema_plus_pg_indexes/middleware/postgresql/migration.rb

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,24 @@ def before(env)
1212
env.options[proper] = env.options.delete(deprecated)
1313
end
1414
end
15+
16+
case env.caller.class.name
17+
when /TableDefinition/
18+
# When index creation is in table definition, create a dummy value for column_names,
19+
# since index definitions are indexed by column names
20+
env.column_names = dummy_column_names(env) if env.column_names.blank?
21+
else
22+
# For actual index creation, strip out the dummy column name
23+
# value
24+
env.column_names = [] if env.column_names == dummy_column_names(env)
25+
end
1526
end
16-
end
1727

28+
def dummy_column_names(env)
29+
["--expression--", env.options[:expression]]
30+
end
31+
end
1832
end
1933
end
2034
end
2135
end
22-

spec/schema_spec.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,19 @@ class User < ::ActiveRecord::Base ; end
2222
expect(User.indexes.first.name).to eq("no_column")
2323
end
2424

25+
it "defines two indexes with expression only" do
26+
define_schema do
27+
create_table :users do |t|
28+
t.string :one
29+
t.string :two
30+
t.index :expression => "upper(one)", name: "index_one"
31+
t.index :expression => "upper(two)", name: "index_two"
32+
end
33+
end
34+
expect(User.indexes.map(&:name)).to eq(["index_one", "index_two"])
35+
expect(User.indexes.map(&:expression)).to eq(["upper((one)::text)", "upper((two)::text)"])
36+
end
37+
2538
it "defines index with expression as column option" do
2639
define_schema do
2740
create_table :users do |t|

0 commit comments

Comments
 (0)