Быть максимально сухим в приложении Ruby on Rails
В настоящее время я использую удивительный плагин attachment-fu для приложения на Rails, но, как начинающий разработчик, я никогда не сталкивался со сценарием, подобным тому, в котором я оказался.
По сути, я использую плагин attachment-fu на двух уровнях.
- Предназначен для пользовательских аватаров в пользовательском классе.
- Разрешить вложения файлов (PDF и т. Д.) В систему обмена сообщениями.
Мой вопрос заключается в том, как лучше всего использовать эти ситуации, чтобы они оставались СУХИМЫМИ, четкими и последовательными.
Очевидно, что не имеет смысла определять и запускать плагин в обоих классах, но для меня есть что-то очень странное (возможно, необоснованное) в том, чтобы просто идти вперед и настраивать все это в благочестивом классе Application.
Есть ли что-то среднее или родительский класс - путь?
Спасибо!
6 ответов
Я бы склонялся к использованию родительского класса с подклассами для различных способов, которыми вы намерены фактически использовать вложения в своем приложении. Возможно, это не самое СУЩЕСТВЕННОЕ решение, доступное, однако, оно вполне поддается логическому шаблону.
В чем проблема DRY с двойным определением настроек attachment_fu?
Если файлы не одного типа и не хранятся в одном месте, вы не будете повторять что-либо в конфигурации.
Конечно, у вас будет два объявления has_attachment, но параметры в основном будут отличаться (одно объявление для ваших аватаров, а другое для ваших PDF-файлов и т. Д.
99,99% кода для обработки вложений будут похоронены в библиотеках attachment_fu, ваш код конфигурации должен быть довольно СУХИМЫМ по умолчанию =)
Что описывает wfarr, так это наследование одной таблицы, что я сейчас и делаю в этой ситуации. У меня есть одна таблица для активов, которая содержит все необходимые столбцы attachment_fu, а также дополнительный столбец с именем type, который будет содержать фактическое имя модели. У меня есть модель для активов и дополнительные модели для определенных типов загрузки, которые наследуются от активов:
asset.rb:
class Asset < ActiveRecord::Base
... attachment_fu logic ...
end
avatar.rb:
class Avatar < Asset
... avatar specific attachment_fu logic ...
end
pdf.rb:
class PDF < Asset
... PDF specific attachment_fu logic ...
end
Является ли поддержка аутсорсинга аватара полностью Gravatar вариант? Есть некоторые плагины Rails, которые будут отображать аватары, размещенные в Gravatar. Вам может не понадобиться заново изобретать колесо там.
Не могли бы вы использовать полиморфные ассоциации?
Я собираюсь поразить это в своем приложении с attachment_fu, так что я не совсем уверен в attachment_fu, но для старого школьного плагина File Column я бы использовал Полиморфные Ассоциации.
Моя "файловая" модель будет:
class FileUpload < ActiveRecord::Base
belongs_to :fileable, :polymorphic => true
file_column :name
end
и тогда любые модели, которым нужно вложение файла, будут выглядеть так:
class Company < ActiveRecord::Base
has_many :file_uploads, :as => :fileable
end
File Column больше не годится, так как он работает в Safari 3.x и больше не поддерживается. Это было мило и просто... О, старые добрые времена...
Что бы это ни стоило, я думаю, что Патрик Беркли хорошо справился с обработкой нескольких вложений через плагин Paperclip. Он изложил свою работу здесь: