RailsのActiveStorageで画像一括ダウンロード機能を3行で追加した。

どーも、yutaです。

Ruby on Railsで画像系はあまり実装したこと無くて、まぁちょっとやってみるかという感じでやったらタイトルの通りでびっくりしたので思わず投稿。

いや、3行は言い過ぎかな?まぁそこは皆さんの判断にお任せします。

ちなみにこれ途中で公開します。

何がしたいか?

いわゆるこういうやつです。

よくありますね。まぁ画像をダウンロードして何に使うかは人によりますが、最近だと同じような属性の画像で教師ありで機械学習に突っ込むとかですかね。やったことないけど。

ちなみに基本的にRailsやらデータベースの設定やらは出来てる前提で行きます。

下準備

今回使うツールやライブラリは以下です。

  • ActiveAdmin
  • ActiveStorage
  • Zipline

ActiveAdminはサッと一括操作の機能が作れるので利用します。

モデルの設定

データの投入

こんな感じでデータが入ります。

ActiveAdminの設定

ActiveAdminで一括ダウンロード操作を追加しましょう。

一括ダウンロード処理のコード

def download_photo_zip(ids)
  Items = Item.where(id: ids).with_attached_image.order(id: :asc)
  files = Items.map { |file| [file.image, "#{file.image.filename}"] }
  zipline(files, 'item_image.zip')
end

ちなみにこれ可読性は落ちますが、1〜2行でも書けちゃいますね。

ファイル名は `”#{file.image.filename}”` だと重複する可能性もあるので、そこは時刻とかいれるも有りですね。

というわけで久しぶりに技術的なこと書いてみました。役に立てれば幸いです。