ridgepoleで想定外のdiffが出るときに試したい1つのこと
SymbolじゃなくてStringを使う
以下詳細。
以下のようなridgepole schemaを書いた。
add_foreign_key 'entries', 'users', name: 'fk_entries_users', column: :author_id
これを初めてapplyするときは問題ない。
add_foreign_key("entries", "users", {:name=>"fk_entries_users", :column=>:author_id})
# ALTER TABLE `entries` ADD CONSTRAINT `fk_entries_users`
# FOREIGN KEY (
# `author_id`)
# REFERENCES `users` (`id`)
しかし、これを一度applyしたあと、再度dryrunすると・・・
remove_index("entries", {:name=>"fk_entries_users"})
remove_foreign_key("entries", {:name=>"fk_entries_users"})
add_foreign_key("entries", "users", {:name=>"fk_entries_users", :column=>:author_id})
# DROP INDEX `fk_entries_users` ON `entries`
# ALTER TABLE `entries` DROP FOREIGN KEY fk_entries_users
# ALTER TABLE `entries` ADD CONSTRAINT `fk_entries_users`
# FOREIGN KEY (
# `author_id`)
# REFERENCES `users` (`id`)
何も変更していないのに、diffが出る。しかもforeign keyを消して作り直すという内容で、こんなの実行されたらたまらん(というか、実行できなかったりする)。
なんでこうなるかというと、:author_idの部分がSymbolだから。
ここの比較が、Hash#==による比較なので、valueがSymbolかStringかの違いは「差がある」判定になっちゃう。なので、文字列として記述してやればOK
Symbolで渡ってきた場合にも文字列に変換して比較するようなPR作ろうかと思ったけど、ちとその影響範囲を考えるまで時間なかった・・・