CarrierWaveで画像を保存する時、画像サイズもデータベースに入れる

管理画面上から画像をアップロードすると同時に画像の縦・横サイズもデータベースに入れてみました。

before_saveを使ってtmp以下に保存されたと同時にfastimageを使用して画像サイズを取得しています。

例外処理が入っているのは管理画面からEditを押して画像以外の部分の編集をした場合に画像データが取得できずにエラーを出すので、その時は元の値をそのまま使用するようにしています。

Gemfile

画像サイズを取得するためfastimageを追加します。

gem 'fastimage'

モデルのbefore_save時に画像サイズを取得してカラムにセットします。

class Goods < ActiveRecord::Base
  before_save :write_width_height
  mount_uploader :image, ImageUploader

  def write_width_height
    begin
      width, height = FastImage.size self.image.file.file
      self.width  = width
      self.height = height
    rescue
      # 編集時、画像がアップロードされていない時は画像サイズを触らない
    end
  end
end