もじれつとがめん

プログラムの忘備録とゲームとかその他色々。

rails 5.2 ActiveStorage を利用するうえでSeed を用意する方法

ActiveStorageをつかって何かしらを実装する際に、そのSeedをどうやって生成するかについてです。

find後のオブジェクトに対してattachするだけ

Active Storage の概要 | Rails ガイド
レコードに結び付ける事自体は上記の公式ドキュメントにも示されている通り、find後にattachするだけで実装できます。
ただし、それをファイルアップロード等ではなくSeed内で明示的にパスを指定して結び付けたいので、
少し手を加える必要があります。

日本語訳はまだ無いようですが、こちらのドキュメントでも説明されてます
Active Storage Overview — Ruby on Rails Guides

attachメソッドの引数で、
io: と filename: を指定することで明示的に指定ができます。
ただし、io: を指定する際は File.openの戻り値を利用する必要があるので注意してください。

File.open('ファイルまでの絶対,あるいは相対パス')

例として、 articlesモデルがあり、そこにvideoとして動画を紐づけたいケースを想定します。

# id 1 のレコードを取得
article = Article.find(1)
# modelで指定している、ActiveStorageの紐づけ名は video の場合
article.video.attach(io: File.open('public/test.mp4'), filename: 'test.mp4')

これでSeedでも登録することができます。