PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Rails 5.2 ActiveStorage com UUIDs no Postgresql


Depois de horas indo linha por linha no activestorage código-fonte , e executando os mesmos comandos
@message = Message.new(message_params)
@message.save

de novo e de novo. Obtivemos os mesmos resultados aleatórios repetidas vezes. Em seguida, percorremos os trilhos de logs impressos ao anexar a imagem à mensagem e observamos o seguinte:
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 estava sendo definido como 534736 , em vez de um uuid. Aqui é onde erramos.

O armazenamento ativo esperava uma chave estrangeira inteira para nosso modelo de mensagem e, em vez disso, queríamos usar uuids. Então tivemos que corrigir nossa migração, para usar uuids em vez de chaves estrangeiras inteiras.

Solução:
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

Espero que isso ajude, alguém enfrentando problemas semelhantes. Felicidades!