Храните две версии файла одновременно с помощью Carrierwave

Я использую драгоценные камни Carrierwave и Fog для хранения файла в своей корзине Amazon S3 (до /files/file_id.txt). Мне нужно сохранить немного другую версию файла в другое место в корзине (/files/file_id_processed.txt) одновременно (сразу после сохранения оригинала). Я не хочу создавать для него отдельный атрибут загрузчика на модели - есть ли другой способ?

Это мой текущий метод, в котором хранится файл:

def store_file(document)
  file_name = "tmp/#{document.id}.txt"

  File.open(file_name, 'w') do |f|
    document_content = document.content
    f.puts document_content
    document.raw_export.store!(f)
    document.save
  end

  # I need to store the document.processed_content

  File.delete(file_name) if File.exist?(file_name)
end

Это модель документа:

class Document < ActiveRecord::Base
  mount_uploader :raw_export, DocumentUploader
  # here I want to avoid adding something like:
  # mount_uploader :processed_export, DocumentUploader
end

Это мой класс Uploader:

class DocumentUploader < CarrierWave::Uploader::Base

  storage :fog

  def store_dir
    "files/"
  end

  def extension_white_list
    %w(txt)
  end
end

person michalvalasek    schedule 12.08.2014    source источник


Ответы (2)


учитывая, что вам нужен аналогичный файл, но с другим именем. для этого вам нужно создать версию файла в загрузчике.

version :processed do
  process
end

и теперь второе имя файла будет обработано_{original_file}.extension. если вы хотите изменить имя второго файла, вы можете использовать эту ссылку https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Customize-your-version-file-names

person Dipak Gupta    schedule 12.08.2014
comment
Спасибо, что наставили меня на правильный путь! Я излагаю свое окончательное решение ниже. - person michalvalasek; 12.08.2014

Вот как выглядит мое окончательное решение (вроде) - на основе ответа Нитина Вермы:

Мне пришлось добавить пользовательский метод процессора для версии в класс Uploader:

# in document_uploader.rb

...

version :processed do
  process :do_the_replacements
end

def do_the_replacements
  original_content = @file.read
  File.open(current_path, 'w') do |f|
    f.puts original_content.gsub('Apples','Pears')
  end
end
person michalvalasek    schedule 12.08.2014