PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Rails 5.2 ActiveStorage mit UUIDs auf Postgresql

Nach stundenlangem Gehen Zeile für Zeile im Quellcode von activestorage , und dieselben Befehle ausführen

@message = Message.new(message_params)
@message.save

wieder und wieder. Wir haben immer wieder die gleichen Zufallsergebnisse. Dann gingen wir die gedruckten Protokollschienen durch, während wir das Bild an die Nachricht anhängten, und beobachteten Folgendes:

S3 Storage (363.4ms) Uploaded file to key: KBKeHJARTjnsVjkgSbbii4Bz (checksum: S0GjR1EyvYYbMKh44wqlag==)

ActiveStorage::Blob Create (0.4ms)  INSERT INTO "active_storage_blobs" ("key", "filename", "content_type", "metadata", "byte_size", "checksum", "created_at") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"  [["key", "KBKeHJARTjnsVjkgSbbii4Bz"], ["filename", "sample.pdf"], ["content_type", "application/pdf"], ["metadata", "{\"identified\":true}"], ["byte_size", 3028], ["checksum", "S0GjR1EyvYYbMKh44wqlag=="], ["created_at", "2018-07-26 04:54:33.029769"]]

ActiveStorage::Attachment Create (2.7ms)  INSERT INTO "active_storage_attachments" ("name", "record_type", "record_id", "blob_id", "created_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["name", "file"], ["record_type", "Message"], ["record_id", "534736"], ["blob_id", "0"], ["created_at", "2018-07-26 05:04:35.958831"]]

record_id wurde als 534736 festgelegt , anstelle einer uuid. Hier sind wir falsch gelaufen.

Active Storage erwartete einen ganzzahligen Fremdschlüssel für unser Nachrichtenmodell, und wir wollten, dass es stattdessen uuids verwendet. Also mussten wir unsere Migration korrigieren, um UUIDs anstelle von Integer-Fremdschlüsseln zu verwenden.

Lösung:

class CreateActiveStorageTables < ActiveRecord::Migration[5.2]
  def change
    create_table :active_storage_blobs, id: :uuid do |t|
      t.string   :key,        null: false
      t.string   :filename,   null: false
      t.string   :content_type
      t.text     :metadata
      t.bigint   :byte_size,  null: false
      t.string   :checksum,   null: false
      t.datetime :created_at, null: false

      t.index [ :key ], unique: true
    end

    create_table :active_storage_attachments, id: :uuid do |t|
      t.string     :name,     null: false
      t.references :record,   null: false, polymorphic: true, index: false, type: :uuid
      t.references :blob,     null: false, type: :uuid

      t.datetime :created_at, null: false

      t.index [ :record_type, :record_id, :name, :blob_id ], name: "index_active_storage_attachments_uniqueness", unique: true
    end
  end
end

Hoffe das hilft, jemand mit ähnlichen Problemen. Prost!