[RUBY] Comment générer automatiquement un diagramme ER lors de la migration avec Rails 6

introduction

Nous avons résumé comment générer automatiquement des diagrammes ER dans Rails6. Dans le cas de Rails6, Zeitwerk est utilisé par défaut pour le chargement automatique du fichier, mais à cause de cela, le diagramme ER n'a pas pu être généré correctement, donc la solution de contournement est également décrite.

Environnement de développement

Rails: 6.0.3 Ruby:2.7.1 Macbook Pro Graphviz GraphQL (Cela était dû au fichier généré automatiquement.)

Paramètres du diagramme ER

Installez Gem.

Gemfile


group :development do
  gem 'rails-erd'
end

Réglez sur gitignore si nécessaire.

.gitignore


*.dot

Vous pouvez générer un diagramme ER avec la commande suivante.

$ bundle exec erd

Paramètres générés automatiquement

Pour générer automatiquement un diagramme ER pendant la migration, définissez-le dans Rakefile. Si vous n'avez pas besoin de génération automatique, vous n'avez pas besoin de le mentionner ici.

Rakefile


#Accrochez la tâche de migrer
Rake::Task['db:migrate'].enhance do
  if Rails.env.development?
    Rake::Task[:after_migrate].invoke
  end
end

#Tâches après la migration
task after_migrate: :environment do
  Rake::Task[:create_erd].invoke
end

#Créer un diagramme ER
task create_erd: :environment do
  # attributes=foreign_keys,primary_keys,timestamps (Les attributs affichent la clé primaire, la clé externe, l'horodatage)
  # sort=false (Les noms de colonnes ne sont pas classés par ordre alphabétique)
  # filename=loof-api-server-erd (nom de fichier)
  # filetype=dot (Extension de fichier)
  sh 'bundle exec erd --attributes=foreign_keys,primary_keys,content,timestamps --sort=false --filename=hogehoge --filetype=dot'
end

Contre-mesures d'erreur

Mesures non recommandées

Lorsque j'ai arrêté d'utiliser zeitwerk, qui charge automatiquement les fichiers, et que je suis passé au classique, j'ai pu le générer automatiquement, mais Rspec n'a pas réussi.

config/application.rb


config.autoloader = :classic

À propos de l'erreur de constante non initialisée XXX (NameError) de zeitwerk [Rails Guide 2 Enable Zeitwerk Mode](https://railsguides.jp/autoloading_and_reloading_constants.html#zeitwerk%E3%83%A2%E3%83%BC%E3%83%89%E3%82%92% E6% 9C% 89% E5% 8A% B9% E3% 81% AB% E3% 81% 99% E3% 82% 8B) [Rails Guide 11 Without Zeitwerk](https://railsguides.jp/autoloading_and_reloading_constants.html#zeitwerk%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%AA%E3 % 81% 84% E5% A0% B4% E5% 90% 88)

Les mesures prises

Lorsque j'ai généré le diagramme ER, j'ai eu l'erreur suivante.

Terminal


$ bundle exec erd
Failed: Zeitwerk::NameError: expected file /app/graphql/interface_types/base_interface.rb to define constant Types::BaseInterface, but didn't

Apparemment, la méthode de définition du module n'est pas appropriée. Comment casser Zeitwerk

La cause était le fichier généré automatiquement par GraphQL, donc je l'ai changé comme suit.

base_interface.rb


module Types
  module BaseInterface
    include GraphQL::Schema::Interface
    field_class Types::BaseField 
  end 
end

Après les mesures ↓

base_interface.rb


module Types::BaseInterface
  include GraphQL::Schema::Interface
  field_class Types::BaseField
end

Modifiez également d'autres fichiers.

base_scalar.rb


module Types
  class BaseScalar < GraphQL::Schema::Scalar
  end
end

Après les mesures ↓

base_scalar.rb


class Types::BaseScalar < GraphQL::Schema::Scalar
end

Lorsque j'ai généré à nouveau le diagramme ER, l'erreur suivante est apparue cette fois.

Terminal


$ bundle exec erd
Failed: RuntimeError: Saving diagram failed!
Verify that Graphviz is installed and in your path, or use filetype=dot.

Il est nécessaire de spécifier le fichier comme point.

Terminal(Spécifiez le fichier)


$ bundle exec erd --filetype=dot

Vous avez généré avec succès un diagramme ER!

À la fin

Puisque Rails6 x GraphQL a été utilisé, l'auroload n'a pas pu être effectué correctement et l'erreur s'est produite.

Recommended Posts

Comment générer automatiquement un diagramme ER lors de la migration avec Rails 6
Comment générer manuellement un JWT avec Knock in Rails
Comment définir des variables d'environnement lors de l'utilisation de Payjp avec Rails
Comment spécifier la base de données lors de la création d'une application avec des rails
Comment résoudre les erreurs qui se produisent lors de l'installation de Rails 5.1.3
Comment créer un environnement Rails 6 avec Docker
[Rails] Comment écrire lors de la création d'une sous-requête
Comment créer une API avec GraphQL et Rails
[Rails] Comment créer un environnement avec Docker
Comment générer automatiquement un constructeur dans Eclipse
Comment écrire des rails
Comment désinstaller Rails
Comment pousser une application développée avec Rails vers Github
Comment supprimer un objet new_record construit avec Rails
Déployer automatiquement sur WildFly avec Jenkins lorsque SVN s'engage
[Comment insérer une vidéo dans un hameau avec Rails]
[Rails] Comment gérer les modifications d'URL après le rendu
Comment interroger Array dans jsonb avec Rails + postgres
[Rails] Solution lorsque l'erreur "visite de la méthode non définie" "apparaît lors de l'utilisation de Capybara avec Rspec
[rails] Comment publier des images
[Rails] Comment utiliser enum
[Rails] Comment utiliser enum
Comment lire les itinéraires des rails
[Facile] Comment formater automatiquement les fichiers Ruby erb avec vsCode
[Avec des astuces de retour] Comment présenter React aux rails les plus simples
Comment utiliser la jonction de rails
Comment numéroter (nombre) avec html.erb
Comment mettre à jour avec activerecord-import
Comment écrire et noter lors de la migration de VB vers JAVA
Comment terminer le serveur de rails
Comment écrire des graines de Rails
[Rails] Comment utiliser la validation
[Rails] Comment désactiver les turbolinks
[Rails] Comment utiliser authenticate_user!
[Rails] Comment mettre en œuvre le scraping
[Rails] Comment faire des graines
Comment écrire le routage Rails
[Rails] Comment installer simple_calendar
[Rails] Comment installer reCAPTCHA
[Rails] Comment utiliser Scope
[Rails / RSpec] Comment traiter l'élément a une erreur de taille nulle
Est-il possible de générer automatiquement Getter / Setter avec l'interface Java?
[Rails] Comment introduire le kaminari avec Slim et changer le design
Comment installer Pry après avoir créé un environnement de développement Rails avec Docker
[Rails] Comment éviter "Utiliser la syntaxe des fusées de hachage" lors de l'exécution de Rubocop
Ce à quoi j'étais accro lors de la mise en œuvre de l'authentification Google avec des rails