Ich habe eine Rails 3.1-App, die Bilder in einem binären Feld in einer postgresql-Datenbank speichert (Ich kenne mögliche Probleme beim Speichern von Bildern in einer Datenbank, muss dies aber jetzt tun). Alles funktioniert gut im Entwicklungsmodus und unter OSX, aber alle Bilder sind in der App, die für Heroku bereitgestellt wird, defekt. Ich habe überprüft, dass die Daten in der Datenbank korrekt sind, indem ich meinen lokalen Computer auf die gleiche Datenbank wie die Heroku-Instanz zeige und alle Bilder korrekt angezeigt habe.
Das Problem scheint also in ActiveRecord (läuft auf Heroku) zu liegen und lädt die Daten aus der Datenbank. Ich vermute auch, dass es sich um ein Codierungsproblem handelt. Wenn ich die Rails-Konsole lokal laufe, kann ich überprüfen, dass die Bytesize dieser Felder korrekt ist, aber das Ausführen der Rails-Konsole auf Heroku zeigt eine falsche Bytesize. Tatsächlich führt das Laden einer N-Byte-Datei über ActiveRecord auf Heroku zu einer Bytegröße von 2N + 1 für alle Dateien.
Jede Hilfe wird sehr geschätzt.
Die 2n + 1 riecht so, als würden Sie hexadezimale Ausgaben von Ihrem bytea
anstelle des alten Escape-Formats erhalten. Ich vermute, dass Sie eine dedizierte Datenbank verwenden, und das bedeutet PostgreSQL 9.0, die eine andere Standardcodierung für bytea
Wenn Sie von PostgeSQL 8.x zu PostgreSQL 9.x migrieren, können Probleme mit der Kompatibilität von Binärzeichenfolgen auftreten. Die Standarddarstellung ist in Version 9 hexadezimal, aber Version 8 ist auf Escape festgelegt. Sie können PostgreSQL 9 mit Escapezeichen versehen lassen, indem Sie bytea_output manuell setzen.
Wenn ich Recht habe, können Sie die Anweisungen im obigen Link verwenden oder diese zusammengefasste Version verwenden:
DATABASE_URL
, der wie postgres://username:password@host/database_name
aussieht. heroku pg:psql
, um eine PostgreSQL-Konsole zu erhalten. ALTER ROLE username SET bytea_output TO 'escape';
von der Konsole psql
aus, wobei username
natürlich der Benutzername aus (1) ist. psql
machen Sie heroku restart
, um Ihre Anwendung neu zu starten. Versuchen Sie es erneut und hoffentlich erhalten Sie die richtigen Bytes.
Tags und Links ruby-on-rails activerecord postgresql encoding rails-activerecord