読者です 読者をやめる 読者になる 読者になる

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だから。

github.com

ここの比較が、Hash#==による比較なので、valueがSymbolかStringかの違いは「差がある」判定になっちゃう。なので、文字列として記述してやればOK

Symbolで渡ってきた場合にも文字列に変換して比較するようなPR作ろうかと思ったけど、ちとその影響範囲を考えるまで時間なかった・・・