Быть максимально сухим в приложении Ruby on Rails

В настоящее время я использую удивительный плагин attachment-fu для приложения на Rails, но, как начинающий разработчик, я никогда не сталкивался со сценарием, подобным тому, в котором я оказался.

По сути, я использую плагин attachment-fu на двух уровнях.

  1. Предназначен для пользовательских аватаров в пользовательском классе.
  2. Разрешить вложения файлов (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. Он изложил свою работу здесь:

http://gist.github.com/33011

Другие вопросы по тегам