PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Railsy 5.2 ActiveStorage z UUID na Postgresql

Po godzinach przechodzenia linia po linii w activestorage kodzie źródłowym i uruchamianie tych samych poleceń

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

znowu i znowu. Wciąż otrzymywaliśmy te same losowe wyniki. Następnie przeszliśmy przez szyny dzienników wydrukowane podczas dołączania obrazu do wiadomości i zaobserwowaliśmy, co następuje:

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 był ustawiony jako 534736 , zamiast uuid. Tutaj popełniliśmy błąd.

Pamięć aktywna oczekiwała klucza obcego w postaci liczby całkowitej do naszego modelu wiadomości i chcieliśmy, aby zamiast tego używała identyfikatorów uuid. Musieliśmy więc naprawić naszą migrację, używając identyfikatorów uuid zamiast całkowitych kluczy obcych.

Rozwiązanie:

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

Mam nadzieję, że to pomoże, komuś podobnemu problemowi. okrzyki!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ruby on Rails:musi pojawić się w klauzuli GROUP BY lub być używany w funkcji agregującej

  2. Porównanie magazynów danych dla PostgreSQL — MVCC vs InnoDB

  3. Instalowanie Postgresa w systemie Windows do użytku z Ruby-on-Rails

  4. Znajdź możliwe duplikaty w dwóch kolumnach, ignorując wielkość liter i znaki specjalne

  5. Postgres Query JSON Array, który zawiera coś