2012-04-20 5 views
10

Ich habe ein Modell mit einer avatar Büroklammerbefestigung. Es hat jetzt einen einfachen StandardpfadBüroklammer + S3: Migrieren vorhandener Dateien von einem: Pfadformat zu einem anderen

has_attached_file :avatar, 
    :path => "/:id-:style-:filename" 

Was ich ein bewegen müssen, um in ein verschleierten

has_attached_file :avatar, 
    :path => "/:id-:hash.:extension" 
    :hash_secret => 'asecuresecret' 

Alles funktioniert gut mit neuen Bildern, aber wie Migration mir die vorhandenen Dateien in S3 auf dem gespeicherte neues Pfadformat, dh sie umbenennen?

Ich verwende Büroklammer 2.7 und Rails 3.2

Dank !!!

+0

Für Interessierte ist der Wechsel von Hash zu Non-Hash ein wenig interessanter und die beste Methode, die ich gefunden habe, ist eine neue 'has_attached_file' zu ​​erstellen, um die Migration durchzuführen. –

Antwort

3

Diese Rechenaufgabe sollte den Zweck erfüllen. Ich habe es mit aws-sdk 1.5.2 und ruby ​​1.9.3p194 versucht.

Die new_key sollte Ihrem neuen Büroklammerpfad zugeordnet werden. Vergessen Sie nicht, :acl entsprechend Ihren Bedürfnissen einzustellen.

Die ursprüngliche Datei sollte manuell oder mit einer ähnlichen Aufgabe gelöscht werden, sobald Sie sicher sind, dass die neue Datei korrekt ist.

+0

Getestet mit '' aws-sdk'' 1.26 und Rubin 2.0. Danke und Entschuldigung für die verspätete Annahme! – dgilperez

0

Ich würde eine Rake-Aufgabe (oder nur ein einfaches Skript, wenn Sie es vorziehen, im Rails-Kontext ausgeführt werden) schreiben. Wenn Sie das Attribut "aws-s3" verwenden, durchlaufen Sie die Instanzen des Modells, von denen Sie wissen, dass sie das alte Pfadformat haben, oder versuchen Sie, eine Bedingung für den Dateinamen zu schreiben und die Verschiebung einzeln.

Model.find_in_batches(:batch_size => 500, 
     :conditions => "avatar_filename like 'SOMETHING_MATCHING'") do |o| 
    AWS::S3::S3Object.rename(old_path(o.avatar), o.avatar.url, 'BUCKET_NAME') 
end 

Wenn Sie bereits Avatar mit der neuen Pfad Definition konfiguriert haben, schreiben Sie eine Methode, die den alten Pfad, basierend auf den Avatar Eigenschaften aufbauen kann.

Sie können die Datei aws-s3 gem docs here lesen, um zu erfahren, wie Sie eine Verbindung zu Ihrem S3-Konto herstellen können.

9

Wenn Sie nur mit Büroklammer arbeiten möchten und sich keine Gedanken über das erneute Hochladen machen, habe ich einen anderen Ansatz verfolgt.

Nehmen wir an, Sie haben die folgende:

class User 
    has_attached_file :image, path: "/:old_path/:filename" 
    ... 
end 

und Sie wollen den neuen Pfad migrieren: "/:new_path/:filename"

mein Vorschlag ist eine FakeUser mit dem alten Pfad zu erstellen und sie in der Benutzer ändern Modell.

class FakeUser 
    self.table_name = :users 
    has_attached_file :image, path: "/:old_path/:filename" 
    ... 
end 

class User 
    has_attached_file :image, path: "/:new_path/:filename" 
    ... 
end 

Sie können nun die folgende Migration schreiben:

FakeUser.find_each do |fake_user| 
    User.find(fake_user.id).update(image: fake_user.image) 
    fake_user.image.destroy 
end 

Anschließend können Sie das FakeUser Modell löschen, wenn die Migration abgeschlossen ist.

Dieser Ansatz funktioniert übrigens auch perfekt, um vom lokalen Dateisystem nach S3 oder umgekehrt zu migrieren.

+3

das hat für mich funktioniert, ich könnte es sogar vereinfachen, indem ich das falsche Modell vom echten Modell vererbte 'Klasse FakeUser silva96

+0

Sehr gute Lösung, um alle Ihre Dateien zu migrieren! Besser als die Skripte, die ich gesehen habe. –

Verwandte Themen