PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Types énumérés avec ActiveRecord et Postgresql

Vous devez passer de db/schema.rb vers db/structure.sql .

Le problème sous-jacent est que schema.rb est une représentation de la structure de la base de données telle qu'ActiveRecord la voit mais ActiveRecord ne comprend pas beaucoup de choses (comme create type , les contraintes CHECK et d'autres choses qui apparaissent dans execute some_raw_sql instructions dans les migrations) que PostgreSQL fait. Vous pouvez create type tout ce que vous voulez sauf schema.rb ne le verra jamais.

Si vous voulez utiliser des choses qu'ActiveRecord ne comprend pas, vous devez utiliser db/structure.sql pour stocker la structure de votre base de données. structure.sql stocke la structure de la base de données telle que la base de données la comprend, et non telle qu'ActiveRecord la comprend.

Le changement est facile :

  1. Mettre à jour votre config/application.rb pour contenir config.active_record.schema_format = :sql .
  2. Faire un rake db:structure:dump pour obtenir un db/structure.sql initial .
  3. Supprimez db/schema.rb à partir de votre arborescence de répertoires et de votre contrôle de révision.
  4. Ajouter db/structure.sql au contrôle des révisions.
  5. Ajustez vos habitudes de rake :
    • Utilisez db:structure:dump au lieu de db:schema:dump
    • Utilisez db:structure:load au lieu de db:schema:load

Cela dit, je ne sais pas à quel point le enum natif de PostgreSQL les types interagiront avec ActiveRecord comme je ne l'ai jamais fait. enum d'AR s sont une traduction côté client entre des chaînes et des entiers mais le enum s sont gérés à l'intérieur de la base de données et ils ne se connaissent pas. Il pourrait y avoir des conflits et vous devrez vous assurer de les garder synchronisés les uns avec les autres.