😃
ridgepoleでfulltext indexを貼る方法
MySQLの全文検索インデックス
MySQL5.6から、fulltext
インデックスを貼ることができるようになった。(pluginによるparserの変更は5.7から?)
ridgepoleでfulltext indexを貼ると発生する問題
create_table :fuga do
...
t.text :hoge
...
end
execute("CREATE FULLTEXT INDEX fk_hoge ON fuga(hoge) WITH PARSER ngram")
この書き方だと、冪等性がなく、
2回目以降に実行すると、一度、 remote_index :hoge
が行われたあとに、再度、 execute
の CREATE FULLTEXT INDEX
が呼ばれてしまう。create_table
句で name
に対するindexを貼っていないための模様
この状態だと、マイグレーションを走らせるたびに、重いINDEXを貼る作業が毎回行われるので、回避するべき事象となる。
対処方法
create_table :fuga do
...
t.text :hoge
t.index :hoge, type: :fulltext, ignore: true # これを追加
...
end
execute("CREATE FULLTEXT INDEX fk_hoge ON fuga(hoge) WITH PARSER ngram") do |c|
# INDEXが登録済みの場合は再実行しない
rows = c.raw_connection.query("SHOW INDEX FROM fuga")
rows.none? { _1[2] == 'fk_hoge' }
end
ignore
を含んだ、TableDefinitionを追加し、 execute
にINDEXの存在を確認するブロックを渡すことで、再実行してもOKになる。
超参考
Discussion