Да.Я использую наследование отдельных таблиц (STI) на сайтах для обработки аудио, видео и изображений через модель активов.
# models/Asset.rb
class Asset < ActiveRecord::Base
# Asset has to exist as a model in order to provide inheritance
# It can't just be a table in the db like in HABTM.
end
# models/Audio.rb
class Audio < Asset # !note inheritance from Asset rather than AR!
# I only ever need the original file
has_attached_file :file
end
# models/Video.rb
class Video < Asset
has_attached_file :file,
:styles => {
:thumbnail => '180x180',
:ipod => ['320x480', :mp4]
},
:processors => "video_thumbnail"
end
# models/Image.rb
class Image < Asset
has_attached_file :file,
:styles => {
:medium => "300x300>",
:small => "150x150>",
:thumb => "40x40>",
:bigthumb => "60x60>"
}
end
Все они входят в Rails как :file
, но контроллер (A / V /Я) знает, чтобы сохранить для правильной модели.Просто помните, что все атрибуты для любых форм мультимедиа должны быть включены в Asset
: если для видео не нужны заголовки, а для изображений нужны, атрибут caption будет равен нулю для Video
.Не будет жаловаться.
Ассоциации также будут работать нормально, если подключены к моделям STI.User has_many :videos
будет работать так же, как вы используете его сейчас, просто убедитесь, что вы не пытаетесь сохранить его непосредственно в Asset.
# controllers/images_controller.rb
def create
# params[:image][:file] ~= Image has_attached_file :file
@upload = current_user.images.build(params[:image])
# ...
end
Наконец, поскольку у вас есть модель активов, вы все равно можетечитать непосредственно из него, если, например, вы хотите список 20 самых последних активов.Кроме того, этот пример не ограничивается разделением типов мультимедиа, его также можно использовать для разных типов одного и того же: Avatar