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作ろうかと思ったけど、ちとその影響範囲を考えるまで時間なかった・・・