qweewq
@qweewq
ruby, ruby on rails, devops

Каким способом добавить вложения разных типов данных (Аудио, Видео, Документы)?

Каким способом добавить много вложений разных типов данных (Аудио, Видео, Документы)?



Допустим, есть Статья.

Я хочу к Статье прицепить 3 видео, 5 аудио, 2 pdf и 1 картинку. Эти вложения я хочу использовать и в других статьях отдельно друг от друга.

Как это можно встроить при помощи gem carrierwave, например?



Есть рабочий код, но он работает не совсем так, как нужно:



class Post < ActiveRecord::Base<br>
  belongs_to :user<br>
  has_many :attachments<br>
end<br><br>
class Attachment < ActiveRecord::Base<br>
  attr_accessible :post_id, :image, :remote_image_url, :document, :remote_document_url, :video, :remote_video_url<br>
  belongs_to :post<br>
  belongs_to :user<br><br>
  mount_uploader :image, ImageUploader<br>
  mount_uploader :document, DocumentUploader<br>
  mount_uploader :video, VideoUploader<br>
end<br>
  • Вопрос задан
  • 3527 просмотров
Решения вопроса 1
shebanoff
@shebanoff
Тут нужно решить две задачи.

1. Связать посты промежуточной сущностью PostAttachment, что позволит использовать аттачмент с разными постами.

class PostAttachment < ActiveRecord::Base
  belongs_to :post
  belongs_to :attachment
end

class Post < ActiveRecord::Base
  has_many :post_attachments
  has_many :attachments, through: :post_attachments 
end

class Attachment < ActiveRecord::Base
  ...
end

2. Реализовать полиморфизм у самого Аттачмента.

Можно пойти напрямую, и создать под каждый тип аттачмента свой класс, а затем воспользоваться тем, что предлагает рельса внутри PostAttachment. Таким образом, у Вас получится довольно практичная связь поста с N разных классов.
Если этот способ кажется грубым, то можно объединить эти N классов в одну табличку с помощью Single Table Inheritance, например вот так. Очевидный плюс, который Вы при этом получите — каждый из классов VideoAttachment, AudioAttachment и т.п. будет явно отделен от самого Attachment. Соответственно, логика будет хорошо разделена.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы