sql >> Database >  >> RDS >> PostgreSQL

Rails 5.2 ActiveStorage met UUID's op Postgresql

Na uren regel voor regel in de activestorage broncode , en dezelfde opdrachten uitvoeren

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

opnieuw en opnieuw. We kregen keer op keer dezelfde willekeurige resultaten. Daarna gingen we door de logs die waren afgedrukt terwijl we de afbeelding aan het bericht bevestigden en zagen het volgende:

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 werd ingesteld als 534736 , in plaats van een uuid. Hier gingen we de fout in.

Actieve opslag verwachtte een integere refererende sleutel voor ons Message-model, en we wilden dat het in plaats daarvan uuids zou gebruiken. Dus moesten we onze migratie repareren, om uuids te gebruiken in plaats van gehele buitenlandse sleutels.

Oplossing:

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

Ik hoop dat dit helpt, iemand met soortgelijke problemen. proost!



  1. SQL JOIN versus IN-prestaties?

  2. mysql update-query met subquery

  3. Scala Slick impliciete conversie van meerdere typen in onbewerkte SQL-query

  4. Gegevens uit een samengevoegde tabel halen