2016-10-18 2 views
1

Я хочу, чтобы мои пользователи могли загружать видео, документы & изображений на s3.Как DRY-ly обрабатывать несколько типов загрузки с помощью Carrierwave?

Я думал, что вместо того, чтобы иметь модель для каждого, а затем иметь 3 разных класса загрузчика, у меня просто будет 1 общий загрузчик и просто выберите белый список всех этих типов файлов.

Но я не уверен, что это лучший подход, с точки зрения безопасности?

Кроме того, могут быть небольшие вариации с каждым типом. Например, с video пользователь должен иметь возможность как загружать видео, так и предоставлять ссылку YouTube.

Какой самый Rails/DRY-способ подходит к этому?

+0

Это одна из тех более сложных проблем, которая выходит за рамки конвенции. Существует много способов решить эту проблему (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, который имеет все поведение, связанное с желанием, и включает в себя три модели и пусть все они будут на деле.

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+ design + in + ruby ​​ –

+0

У меня было это в моем списке желаний в течение некоторого времени, просто еще не успел сделать это. Спасибо за напоминание, хотя. – marcamillion

1

Помимо использования STI, как упомянуто C dot вы также можете иметь 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

Смежные вопросы