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

Aufzählungstypen mit ActiveRecord und Postgresql

Sie müssen von db/schema.rb wechseln zu db/structure.sql .

Das zugrunde liegende Problem ist, dass schema.rb ist eine Darstellung der Datenbankstruktur, wie ActiveRecord sie sieht, aber ActiveRecord versteht viele Dinge nicht (wie create type , CHECK-Einschränkungen und andere Dinge, die in execute some_raw_sql auftauchen Anweisungen in Migrationen), die PostgreSQL tut. Sie können create type alles, was Sie wollen, außer schema.rb nie sehen.

Wenn Sie Dinge verwenden möchten, die ActiveRecord nicht versteht, müssen Sie db/structure.sql verwenden um die Struktur Ihrer Datenbank zu speichern. structure.sql speichert die Struktur der Datenbank so, wie die Datenbank sie versteht, nicht so, wie ActiveRecord sie versteht.

Der Wechsel ist einfach:

  1. Aktualisieren Sie Ihre config/application.rb config.active_record.schema_format = :sql enthalten .
  2. Führe einen rake db:structure:dump durch um eine anfängliche db/structure.sql zu erhalten .
  3. Löschen Sie db/schema.rb aus Ihrem Verzeichnisbaum und der Revisionskontrolle.
  4. Fügen Sie db/structure.sql hinzu zur Revisionskontrolle.
  5. Passen Sie Ihre Rake-Gewohnheiten an:
    • Verwenden Sie db:structure:dump statt db:schema:dump
    • Verwenden Sie db:structure:load statt db:schema:load

Allerdings bin ich mir nicht sicher, wie gut die native enum von PostgreSQL ist Typen werden mit ActiveRecord interagieren, wie ich es noch nie getan habe. ARs enum s sind eine clientseitige Übersetzung zwischen Strings und Ganzzahlen, aber PostgreSQLs enum s werden innerhalb der Datenbank behandelt und wissen nichts voneinander. Es kann zu Konflikten kommen, und Sie müssen sicherstellen, dass sie miteinander synchronisiert bleiben.