如何使用carrierwave添加条件mount_uploader

时间:2014-08-02 10:50:42

标签: ruby-on-rails ruby carrierwave

假设我的模型CustomMetric(EAV类型)具有String类型的字段label,value,data_type,而data_type可以是以下字符串之一

"Text","Decimal","Percentage","Range","Date","Image","Document"

现在我想先检查data_type是否为Image,然后再安装上传器。

like =>

class CustomMetric < ActiveRecord::Base
    mount_uploader :value, ImageUploader, if: :is_image_type?

    def is_image_type?
        self.data_type == "Image"   
    end
end

但是上面的代码不起作用。它在没有检查条件的情况下安装值。

有没有办法做到这一点。有没有可能与carrierwave ..?还有其他选择吗?

1 个答案:

答案 0 :(得分:2)

上面的用例可以用单表继承解决,而CarrierWave v1.1.0仍然没有条件挂载。但...

请注意,mount_uploader在课程中首先includes a module,然后overrides原始value=来调用所包含的方法value= defined模块。因此,解决方法只是在调用mount_uploader后重新定义访问者

class CustomMetric < ActiveRecord::Base
    mount_uploader :value, ImageUploader

    def value=(arg)
        if is_image_type?
            super
        else
            write_attribute(:value, arg)
        end
    end

    def value
        # some logic here
    end

    def is_image_type?
        self.data_type == "Image"   
    end
end