Rails8 Changelogまとめを読む
144件の変更が含まれている
メモ
ActiveRecordからのDB問い合わせの結果をキャッシュしてくれるやつ。デフォルト有効。これfalseにしようと思ったことなかった...。
UNIQUE INDEXはデフォルトでNULLを区別しないがNULLS NOT DISTINCTを指定するとNULLでも区別できるようになる。なのでUNIQUE INDEXが貼られているカラムにNULL値を複数入れられなくなる。
PostgreSQL15からの機能
primary以外のDBがある時に従来のdb:prepareはseedを実行してしまうのでprimaryなどの既存のDBのデータを初期化してしまう挙動があったんだ。複数DB使ったことないのでこの辺全然知らなかった...
PG::UnableToSend: no connection to the serveというエラー
DB接続がタイムアウト/コネクションプールの管理ミス/外部スレッドや非同期処理での接続、の際にDBとの接続が切れた場合に発生するエラー
通常はwith_connectionを使うと適切にコネクションプールからコネクションを取得して利用し、終わったら解放するのでリークも発生しない。
コネクションプールにコネクションがない時ってエラーにならずwaitするんだっけ?
する
関連
strict loading
N+1クエリが発生しているとエラーを発生させるやつ。開発環境でOnにしておくと早期に気づけて便利。
statement cache
クエリの解析&準備のステップをキャッシュして毎回解析が発生するのを防ぎパフォーマンス向上を行うやつ
code:rb
User.find(1) # ここでSQLの作成が行われ SELECT * from users where id = ? というprepared statementがキャッシュされる
User.find(2) # ここでは先ほどキャッシュしたprepared statementを使い回し解析段階をスキップする
ちなみにUser.where("created_at > ?", Time.now - 1.day)みたいな動的な値をwhereに差し込むとstatemenet cacheが効かない。
これならいけるっぽい
code:rb
time_threshold = Time.now - 1.day
User.where("created_at > ?", time_threshold)
allow_retry: trueオプション
モンキーパッチで追加できる。クエリのリトライ処理が可能に。Shopifyなどでは有効にされてるらしい?
ActiveRecord完全に理解した本