Table shoji 1nd. Rails 6 multi-db and autoloader 2019-11-16
multi-db
問題
本番で replica に繋げているときに write すると ReadOnly エラーになる
明示的に connected_to(:readonly) している中で Model.create する等
テストで、このエラーが出ないことを担保したいが、
テストでは常に master 側の connection に繋がるので ReadOnly エラーを発生させることができない
Rails の middleware で GET だと replica に繋がるので、GET リクエストの中で書き込むと本番でエラーになる
use_transactional_tests を false にすると解決はする
database_cleaner と違い、流れた SQL を検知して、テストで使ったテーブルのみを truncate する動きをするため
transactionを上書きする際にreplicaであるというメタ情報を落としてしまっているので例外が発生しない
雑にメタ情報を上書きするのをやめてrailsレイヤでハンドリングできるように上書きしてほしい
雑に作ってみたら let でデータを作成するときも replica 側に書き込んでしまう
before にすると GET のコンテキストに入る前にデータ作成になるので、なんとかなるかも
let の実装を必ず master に繋げるようにすると良いかも?
ココだけを上書きしてもメタ情報が落ちた connection が取れるだけなのでやっぱりダメかも
autoloader
-> これを試してみたら動きました!! shojik.icon
ruby の autoload を使うようになった
knock の問題は以下で解決しそう
コメントを書き込んでいる fkn さんは Zeitwerk の作者なので信頼できそう
auto load の仕組みを知りたかったら Rails Guide を見ると良い
jwtで認証は自前で書いたり、もありらしい