2016-10-18 5 views
1

ユーザーがビデオをアップロードできるようにしたい、&の画像をs3にアップロードする。Carrierwaveで複数のアップロードタイプをDRY-lyで処理するにはどうすればよいですか?

私はそれぞれのモデルを持っているのではなく、3つの異なるアップローダクラスを持っているのではなく、1つの一般的なアップローダを持っていて、これらのファイルタイプをすべてホワイトリストに入れたいと思っていました。

セキュリティの観点からは、これが最善のアプローチかどうかはわかりませんが、

また、それぞれのタイプによって小さなバリエーションがあるかもしれません。たとえば、videoでは、ユーザーは動画をアップロードすることも、YouTubeのリンクを提供することもできます。

これに最も近いRails/DRY方法は何ですか?

+0

これは、慣例の範囲外の、より複雑な問題の1つです。この問題(STI、MTI、動的列など)を解決する方法はたくさんありますが、それぞれ独自の長所と短所があります。 – max

答えて

3

汎用タイプを作成し、STI(Single Table Inheritance)を使用してサブタイプを作成することができます。サブタイプが非常に異なっていると感じない限り、いくつかのサブタイプには空の列がたくさんあり、他のタイプはそうでないと、これは最善の方法と思われます。セキュリティの観点からは、実際にどのような意味で大きなインパクトがあるのか​​分かりません。

class FileUpload < ActiveRecord::Base 
end 


class Video < FileUpload 
end 

class Image < FileUpload 
end 

class Document < FileUpload 
end 

しかし、これをしないと合理的なケースがあります。通常、継承の経験則は、あるものが型である場合ですが、この場合は灰色の領域があります。あいまいさは、ドキュメントがアップロード可能なファイルのタイプであるが、そのタイプのビデオではないという事実から来ている。だから、ビデオと同じようにアップロード可能なファイルの動作を持たせたいが、類似性が止まったファイルの動作をしたい。したがって、より良いルートはおそらく、アップロード可能なmoduleを作成して、すべての欲求共有行動を持ち、それを3つのモデルに含め、それらをすべて自分のものにすることです。

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

Hrmm ....これは興味深い展望です。君の言う通りかもね。 – marcamillion

+1

あなたがこの本をまだ読んでいないかどうかは分かりませんが、DRYのコンセプトについて多くの洞察が得られます。 https://www.amazon.com/Practical-Object-Oriented-Design-Ruby-Addison-Wesley/dp/0321721330/ref=sr_1_1?s=books&ie=UTF8&qid=1476831726&sr=1-1&keywords=practical+object-oriented+デザイン+イン+ルビー –

+0

私はしばらくの間、私のウィッシュリストにそれを持って、ちょうどまだそれをやり遂げることに慣れていない。しかし、通知をありがとう。 – marcamillion

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' 
    } 
}) 

があなたの問題のために考慮するためのオプションもございます。

+2

しかし、あなたがキャリアウェーブを使ってJSONBを細断することなく引き裂くことができれば大きな問題です。 – max

+0

笑、良い点。私はそれについての詳細を考慮しなかった:) – MMachinegun

関連する問題