2017-05-06 48 views
2

我需要爲3列(VARCHARINTINT)創建多列索引多列索引,可以打電話給他們varchar_colint1_colint2_col。對於VARCHAR列,我需要應用lower(varchar_col)表達式。表達式(PostgreSQL和Rails)的

當我創建表達

add_index :table, 'lower(varchar_col)', name: 'index_name' 

它的工作原理,但是當我嘗試使用

add_index :table, ['lower(varchar_col)', :int1_col, :int2_col], name: 'index_name' 

創建多列,我收到

PG::UndefinedColumn: ERROR: column "lower(varchar_col)" does not exist

是否有可能一個列索引使用Rails add_index函數創建這樣的索引,或者我需要在migrati中執行SQL查詢檔案? PostgreSQL是否支持帶表達式的多列索引?如果支持,我必須在遷移文件中寫入以使其起作用?

謝謝你的幫助!

P.S.我使用Rails 5.

回答

1

您可以用表達式作爲字符串發送列:

add_index :table, 'lower(varchar_col), int1_col, int2_col', name: 'index_name' 
+0

大,謝謝!儘管我已經在遷移文件中執行了SQL查詢,但我在下面添加了答案。 –

0

所以,一個小小的研究之後,我一直在遷移文件中執行SQL查詢做到了。我只是把它留在這裏作爲另一種方法,但伊利亞拉夫羅夫的建議與串列也適用。

遷移文件

def up 
    connection.execute(%q{ 
    CREATE INDEX index_name ON table(lower(varchar_col), int1_col, int2_col) 
    }) 
end 

def down 
    remove_index :table, name: 'index_name' 
end