kikeda1104's blog

備忘録・技術に関することを書いています。(webエンジニア)

ActiveRecord::Base.establishによる複数回切り替え時の不具合

掲題の件、テスト書いていることで発見できまして、APIリファレンスを読むと割と合点はいきましたが 間違えなどあれば、指摘いただきたいです。

環境 - rails 5.0.0.1(puma) - ruby 2.3.1

ActiveRecord::Base.establishを何度も読み出すことで、queryを発行した際に事前に切り替えたDBではなく 切り替え前のDBのままqueryを実行する不具合がテストで見つかりましてその改善策です。

def change_schema
  ApplicationRecord.remove_connection
  ActiveRecord::Base.establish YAML.load_file(Rails.root.join('config', 'database.yml')[Rails.env]
end

clear_all_connection!などを実行しても、上手くリセットされていなかったので、remove_connectionからconnectiondisconnectで切断してから 動作するようになりました。

テストは恩恵も大きいし、テストを定常的に書くのも重要ですね。

参考

ActiveRecord::ConnectionAdapters::ConnectionHandler

https://github.com/rails/rails/blob/473473d7f73a43b8d1e4e604327998c5250dff3c/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb#L891