Wie kann ich eine vorhandene Ordnerhierarchie mit CarrierWave neu organisieren?

Ich versuche, Dateien mithilfe von in meinem S3-Bucket zu verschiebenCarrierWave um die Ordnerstruktur neu zu organisieren.

Ich bin zu einer vorhandenen Rails-Anwendung gekommen, in der alle Bilder für eine Klasse in einen Ordner namens hochgeladen werden/uploads. Dies führt zu Problemen, wenn zwei Benutzer unterschiedliche Bilder mit demselben Dateinamen hochladen und das zweite Bild das erste überschreibt. Um dies zu lösen, möchte ich die Ordner neu ordnen, um jedes Bild in ein eigenes Verzeichnis zu legenActiveRecord Objektinstanz. Wir benutzenCarrierWave um Dateiuploads zu verwalten.

Der alte Uploader-Code hatte die folgende Methode:

def store_dir
  "uploads"
end

Ich habe die Methode geändert, um mein neues Dateispeicherschema wiederzugeben:

def store_dir
  "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end

Dies funktioniert hervorragend für neue Bilder, unterbricht jedoch die URL für alte Bilder. Bei vorhandenen Bildern wird angegeben, dass sich die URL sofort im neuen Ordner befindet, wenn ich das Modell ändere, während die Bilddateien noch in gespeichert sind/uploads.

> object.logo.store_dir
=> "uploads/object/logo/133"

Das ist nicht richtig. Dieses Objekt sollte sein Logo in melden/uploads.

Meine Lösung besteht darin, ein Skript zum Verschieben der Bilddateien zu schreiben, aber ich habe in CarrierWave nicht die richtigen Methoden zum Verschieben der Dateien gefunden. Mein Skript würde ungefähr so ​​aussehen:

MyClass.all.each |image|
  filename = file.name #This method exists in my uploader, returns the file name
  #Move the file from "/uploads" to "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end 

Was soll ich in Zeile drei meines Skripts tun, um die Datei an einen neuen Speicherort zu verschieben?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage