同じにやっても動かない

書いてある通りやっているのに動かないのです

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に戻して解決としました。

いやー
ハマった