ActiveStorage の variant がずっとnilを返す
結論から先に書くと、添付ファイルを設定しているmodelの主キーをstringに設定していることが原因でした。
ActiveStorage用に生成されるmigrationファイルではpolymorphic関連先のid (active_storage_attachments tableのrecord_idカラム) がintegerであることを前提にしています。
なので以下のように t.reference で外部キー制約を設定しています。
# 20230328082729_create_active_storage_tables.active_storage.rb t.references :record, null: false, polymorphic: true, index: false, type: foreign_key_type
今回、主キーをstringに設定したProduct モデルで
# model/product.rb has_one_attached :image
としていたので、以下ステップで関連が壊れていました。
- step.1 integerカラムのrecord_id にstringのprodct.id が渡される
- step.2 active_storage_attachments tableレコードにsaveする際にrecord_idが0に変換され保存される
- step.3 関連が壊れているのでvariant発行時のクエリでが添付ファイルを見つけられず nil を返す
他のモデルでもactiverecordを使うかもしれないのと、Productモデルのidをstringにする必要もなくなっていたので、今回はProductモデルの主キーをdefaultのintegerに戻して解決としました。
いやー
ハマった