wataメモ

日々のメモをつらつらと書くだけ

CarrierWaveでSTI(Single Table Inheritance)した時のstore_dirについて

 またSTI系のネタになってしまったが、CarrierWaveでmountするモデルをSTIにしていると、generateしたままのstore_dirだとtypeが変わった時にパスが変わってしまう。

def store_dir
  "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end

 ここの「model.class.to_s.underscore」部分が子クラスの名前になってしまう。 なので以下のように修正。

def store_dir
  "uploads/#{model_name}/#{mounted_as}/#{model.id}"
end

private
def model_name
  klass = model.class
  while klass.superclass != ActiveRecord::Base
    klass = klass.superclass
  end
  klass.to_s.underscore
end

 STIは面白い考えだが気にしなければいけないことも多い。