我希望我的用户能够上传视频,文档和广告。图像到s3。
我在想,不是每个人都有一个模型,而是有3个不同的上传者类,我只需要一个通用的上传器,然后将所有这些文件类型列入白名单。
但从安全角度来看,我不确定这是否是最佳方法?
此外,每种类型可能会有小的变化。例如,使用video
用户应该能够上传视频,或者提供YouTube链接。
最接近Rails / DRY的方法是什么?
答案 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'
}
})
可以选择考虑你的问题。