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は面白い考えだが気にしなければいけないことも多い。