如何使用Carrierwave彻底处理多种上传类型?

时间:2016-10-18 11:58:52

标签: ruby-on-rails amazon-s3 carrierwave ruby-on-rails-5

我希望我的用户能够上传视频,文档和广告。图像到s3。

我在想,不是每个人都有一个模型,而是有3个不同的上传者类,我只需要一个通用的上传器,然后将所有这些文件类型列入白名单。

但从安全角度来看,我不确定这是否是最佳方法?

此外,每种类型可能会有小的变化。例如,使用video用户应该能够上传视频,或者提供YouTube链接。

最接近Rails / DRY的方法是什么?

2 个答案:

答案 0 :(得分:3)

您可以创建泛型类型,然后使用STI(Single Table Inheritance)创建子类型。除非你觉得子类型彼此如此不同,否则某些子类型中会有很多空列而不是其他子类,这似乎是最好的方法。从安全的角度来看,我看不出在这方面究竟有什么重大影响。

class FileUpload < ActiveRecord::Base
end


class Video < FileUpload
end

class Image < FileUpload
end

class Document < FileUpload
end

然而,有一个合理的理由不这样做。通常,继承的经验法则是某种类型的东西,但在这种情况下有一些灰色区域。模糊性来自这样一个事实,即文档是一种可上载文件,但它不是一种视频。因此,您希望它具有可上载文件的行为,就像视频一样,但这就是相似性停止的地方。因此,更好的路线可能是创建一个能够module的上传,它具有所有渴望的共享行为,并将其包含在三个模型中,让它们全部成为他们的事物。

module Uploadable
end


class Video < ActiveRecord::Base
  include Uploadable
end

class Image < ActiveRecord::Base
  include Uploadable
end

class Document < ActiveRecord::Base
  include Uploadable
end

答案 1 :(得分:1)

除了使用C dot所提到的STI之外,您还可以在模型中添加jsonb列,这样就可以在该字段中存储您想要的任何内容。

以下是关于此主题的精彩内容: http://nandovieira.com/using-postgresql-and-jsonb-with-ruby-on-rails

t.jsonb :videos, null: false, default: '{}'

user = User.create({
  videos: {
    vimeo: 'https://vimeo.com/123',
    file: 'http://example.com/123.mp4',
    youtube: 'https://youtube.com/watch?v=123'
  }
})

可以选择考虑你的问题。

相关问题