4 votes

Ingénierie inverse (Génération) Tables ou schéma de base de données à partir de modèles et vues en Ruby on Rails

Mise à jour : La question est toujours ouverte, toutes les critiques, commentaires sont les bienvenus

J'ai un projet rails existant dans lequel certains fichiers et répertoires importants ont été manquants.

version Rails du projet (2.3.8) que j'ai trouvée dans environment.rb

actuellement ce que j'ai c'est

app
   controllers (déjà entièrement codés)
   helpers  (déjà entièrement codés)
   models (déjà entièrement codés) 
   reports (déjà entièrement codés)
   views  (déjà entièrement codés)

config ---> configurations par défaut (déjà entièrement codées)
lib ---> ne contient rien
public --> contient des images et des scripts (déjà entièrement codés)
script ---> contient le serveur, le runner, le plugin, le dbconsole....

le répertoire app contient totalement l'état de travail des codes, app/model contient plus de 100 fichiers .rb, donc je suppose qu'il y aura plus de 100 tables

les éléments principalement manquants sont répertoire db, fichier .gem, fichier rake, doc, test, vendor, database, schema.rb et migrations

Remarque : je n'ai pas le schéma de table et la base de données pour ce projet

j'ai besoin de générer des tables ou une base de données complète à partir de modèles et de vues et je cherche une sorte d'ingénierie inverse pour générer un schéma de base de données à partir de modèles ou de vues

Je suis nouveau dans Rails et je viens du monde Java, en Java en utilisant Hibernate il y a une option de pojo (modèle en Rails) vers base de données disponible, je cherche quelque chose de similaire pour Rails, et mon principal objectif est de faire fonctionner ce projet, alors les gars, s'il vous plaît aidez-moi.

4voto

ronalchn Points 7215

Pour recréer le schéma de la base de données, cela prendra pas mal de temps.

Vous pouvez obtenir beaucoup d'informations sur la base de données dans le répertoire app/models, app/controllers app/views.

Vous devez savoir qu'ActiveRecord n'est pas vous obligent à énumérer explicitement tous les attributs d'un modèle. Ceci a des implications importantes - vous pouvez seulement déduire quels attributs vous devez encore ajouter à la base de données, en fonction de la référence à un attribut ! Cela signifie que ce travail sera un peu un ART. Et il n'y a pas d'étapes CLAIRES pour accomplir ce travail. Mais vous trouverez ci-dessous quelques règles que vous pouvez utiliser pour vous AIDER.

Il s'agit d'un projet de grande envergure. Vous trouverez ci-dessous des directives, des règles et des conseils pour vous aider. . Mais soyez conscient que cela peut prendre un long temps, et être frustrant parfois pour y parvenir.


Les tables dont vous avez besoin :

Chaque table aura normalement un ActiveRecord::Base modèle. Donc dans le répertoire app/models, vérifiez chaque fichier, et si la classe hérite de ActiveRecord::Base, c'est une table supplémentaire.

Le nom de la table est par défaut une version pluralisée en casse serpentine du nom de la classe.

class UserGroup < ActiveRecord::Base # for this class

le nom de la table est user_groups. Remarquez qu'il s'agit d'un pluriel, et qu'au lieu d'être en minuscules, il est en minuscules, avec des traits de soulignement pour séparer les mots.

Toutes ces tables auront une colonne entière "id". Par défaut, les tables ont également une colonne "created_at", et "updated_at" de type datetime.

Associations et clés étrangères :

Vous pouvez déduire quelles clés étrangères existent par les associations dans les modèles. Toutes les associations sont explicitement listées, donc ce n'est pas trop difficile.

Par exemple :

class UserGroup < ActiveRecord::Base # for this class
  belongs_to :category

Cela signifie que la table user_groups possède une colonne nommée "category_id", qui est une clé étrangère pour la table categories.

Cela signifie que le modèle de catégorie a probablement une relation inverse (mais pas de colonne supplémentaire) :

class Category < ActiveRecord::Base
  has_many :user_groups

La principale autre association est l'association has_many_and_belongs_to. Par exemple.

class A < ActiveRecord::Base
  has_and_belongs_to_many :bs
end
class B < ActiveRecord::Base
  has_and_belongs_to_many :as
end

Cela signifie qu'il y a une table de jonction à ajouter appelée "as_bs" (as et bs sont triés par ordre alphabétique), avec les clés étrangères "a_id" et "b_id".

Toutes les clés étrangères sont des entiers.


Attributs

Ok, donc c'est les associations de tables. Maintenant pour les attributs normaux...

Vous devez vérifier le app/views/user_groups/ ou autre similaire app/views les répertoires.

À l'intérieur, vous trouverez les modèles de vue. Vous devriez regarder les modèles _form.html.erb (en supposant qu'il s'agit de modèles .erb, sinon il pourrait s'agir de modèles .haml, etc.)

Le modèle _form.html.erb, s'il existe, comportera normalement un grand nombre des attributs répertoriés comme champs de formulaire.

Dans le form_for vérifiez s'il indique quelque chose comme f.text_field :name Si le nom de la table est "nom", cela signifie qu'il existe un attribut (une colonne dans la table) appelé "nom". Vous pouvez déduire le type de colonne à utiliser en fonction du type de champ. Par exemple, dans ce cas, il s'agit d'une chaîne de caractères, donc peut-être qu'un VARCHAR(255) est approprié (appelé chaîne de caractères dans Rails).

Vous pouvez également être amené à déduire le type approprié sur la base du nom de l'attribut (par exemple, s'il mentionne quelque chose comme :time, il est probablement de type Time ou DateTime).

Cela peut vous donner tous les autres attributs du tableau. Mais dans certains cas, les attributs peuvent vous manquer. Si vous trouvez une référence à d'autres attributs dans le contrôleur, par exemple app/controllers/user_groups_controller.rb, alors vous devez l'ajouter comme colonne dans votre table. Vous pouvez laisser cela jusqu'à la fin lorsque vous le testez, parce que lorsque vous le testez, si un attribut est manquant, alors il va jeter un NoMethodError pour l'objet du modèle pertinent. Par exemple, s'il est dit que la variable @user_group, de la classe UserGroup, n'a pas de méthode nommée title, alors il lui manque probablement une colonne nommée "title" de type string.


Recréez votre migration/base de données

Ok, maintenant vous savez ce que les tables de la base de données et les noms et types de colonnes doivent être.

Vous devez générer/créer une migration pour votre base de données.

Pour ce faire, il suffit d'utiliser la commande rails generate migration RecreateTables .

Ensuite, vous devriez trouver un fichier dans db/migrate/???_recreate_tables.rb .

A l'intérieur, commencez à écrire du code ruby pour créer vos tables. La référence pour ceci peut être trouvée à http://guides.rubyonrails.org/migrations.html .

Mais essentiellement, vous aurez quelque chose comme :

class RecreateTables < ActiveRecord::Migration
  def up
    create_table :user_groups do |t|
      t.string :name # adds a string (VARCHAR) column called "name"
      t.text :description # adds a textarea type column called "description
      t.timestamps # adds both "created_at" and "updated_at" columns for you
    end
  end

  def down
    drop_table :products # this is the reverse commands to undo stuff in "up"
  end
end

Pour recréer votre Gemfile :

Commencez par ajouter un Gemfile par défaut. Cela peut être fait en utilisant rails new testapplication quelque part pour créer une application rails vide. Copiez ensuite le Gemfile dans votre application réelle. Il vous permettra de démarrer en incluant rails et d'autres gemmes courantes.

Il est TRÈS difficile de déterminer exactement quelles gemmes sont nécessaires. Le mieux que vous puissiez faire est d'essayer de les ajouter une par une en parcourant le code.

Ici aussi, les erreurs MethodNotFound sont vos amies. Lorsque vous testez l'application, en fonction des gemmes que vous avez ajoutées, il se peut qu'elle détecte des méthodes manquantes qui pourraient être fournies par des gemmes. Certaines méthodes manquantes sur les modèles peuvent indiquer des gemmes manquantes (ou elles peuvent indiquer des champs/colonnes manquants dans la base de données). Cependant, les méthodes manquantes sur les classes Controller ou ActiveRelation sont TRÈS probablement dues à des gemmes manquantes.

Vous devrez examiner le code et essayer d'en déduire les gemmes à ajouter.

S'il utilise des méthodes comme can , can? et possède un fichier app/models/ability.rb alors vous devez gem 'cancan' . S'il appelle devise dans un modèle, il faut gem 'devise' . De nombreuses pierres précieuses communes peuvent être vues à http://ruby-toolbox.com .

Après avoir ajouté des gemmes à votre Gemfile, vous devriez exécuter bundle sur votre ligne de commande pour installer les nouvelles gemmes avant de tester à nouveau. Lorsque vous testez à nouveau, vous devez redémarrer votre serveur de test. Redémarrer bundle exec rails server pour démarrer un serveur de test local sur localhost:3000 ou quelque chose comme ça.

Vous pouvez simplement copier le fichier Rake à partir de rails new testapp et il sera probablement comprennent tout ce dont vous avez besoin.

Tests manquants

Le répertoire test/ manquant n'est pas pertinent pour votre application réelle. Il n'est pas nécessaire pour exécuter l'application. Cependant, il contient des scripts automatiques pour tester votre application. Vous devrez réécrire de nouveaux tests si vous voulez tester automatiquement votre application. Cependant, dans le but de remettre votre application en marche, vous pouvez l'ignorer pour le moment.

Répertoire des fournisseurs manquant

Certains codes supplémentaires ne sont pas installés comme une gemme, mais comme un plugin. Tout ce qui est installé en tant que plugin est perdu si vous n'avez pas le répertoire du vendeur. Comme pour les gemmes, le mieux que vous puissiez faire est d'essayer de déduire ce qui pourrait être manquant, et de retélécharger le plugin manquant, soit en réinstallant le plugin, soit en utilisant une gemme de remplacement.


Conseils supplémentaires :

  • Essayez de lire certains des commentaires qui pourraient vous donner le nom de certaines des pierres précieuses utilisées.

  • Si une méthode ou un ensemble de méthodes sont manquantes, et que vous pensez que ce ne sont pas des champs/colonnes de la base de données, cela peut être dû à une gemme manquante. La meilleure chose à faire est de rechercher ces noms de méthodes sur Google. Par exemple, s'il manque "paginate", vous pouvez rechercher "rails paginate gem", et voir de quelles gemmes vous pourriez avoir besoin. Dans cet exemple, vous trouverez probablement "will_paginate" et "kaminari". Ensuite, vous devez essayer de déduire lesquelles de ces gemmes sont nécessaires. Faites peut-être un grep will_paginate app -r sur la ligne de commande pour voir s'il utilise will paginate. La commande grep recherche la chaîne "will_paginate", dans le répertoire appelé "app", -r lui fait faire cela récursivement pour tous les fichiers

2voto

Toshio Points 133

Voici ce que je pense que vous devriez faire.

  1. Identifiez les classes qui correspondent aux tables physiques (vous mentionnez certaines vues dans votre question, ce qui me fait penser qu'un sous-ensemble de vos modèles sont liés à des vues de base de données au lieu de tables réelles). Pour ce faire, vous devez faire correspondre les définitions de vos modèles (classes étendant ActiveRecord::Base) aux déclarations CREATE TABLE dans votre fichier de dump de schéma. Par exemple, la classe Person dans votre code Ruby correspond à CREATE TABLE people dans votre dump de schéma de base de données.

  2. Une fois que vous avez identifié ces modèles (noms de classe), vous démarrez une console Rails et vous tapez ces noms de modèle, un par un, et appuyez sur Entrée. La sortie de la console pour un modèle appelé Person ressemblerait probablement à ceci :

>> Person
=> Person(id: integer, first_name: string, last_name: string)

Ensuite, vous prenez ce qui se trouve entre les parenthèses, vous supprimez le id: integer, , vous supprimez les virgules, vous supprimez les espaces après les deux-points, obtenant ainsi quelque chose comme ceci :

first_name:string last_name:string

Ayant fait cela, la commande pour générer la migration ressemblerait à ceci :

rails g migration Person first_name:string last_name:string

Ensuite, vous démarrez un nouveau projet Rails quelque part ailleurs, effectuez toutes ces migrations et inspectez le contenu de db/migrate. Vos migrations sont très probablement à 90% terminées, ce qu'il vous reste à faire est de remplacer certaines instances de t.integer par t.references, et d'autres petites choses qui sont totalement spécifiques au domaine et impossibles à saisir dans une réponse générique.

J'espère que cela aide.

2voto

sameera207 Points 7885

Même si Rails est un framework web full stack, il fonctionnera également sans certaines parties, si vous le souhaitez,

Exemple : dans votre cas

db - le répertoire est là pour conserver les migrations afin de créer votre base de données / tables, mais si vous utilisez une base de données héritée ou si la gestion de la base de données est gérée par des administrateurs de base de données, vous pourriez ne pas en avoir besoin. (vous pouvez simplement vous connecter à la base de données via le fichier database.yml)

Le fichier Gem vous aide à conserver tous les gems (bibliothèques) au même endroit que vous le faites avec Maven (en Java)

test, encore une fois, si vous ne rédigez pas de cas de test (ce qui est absolument une mauvaise idée), vous n'avez pas besoin de cela

vendor, est pour les plugins tiers et doc est pour la documentation, donc la même règle s'applique, si vous n'en avez pas besoin vous pouvez les ignorer

En Rails, Hibernate s'appelle "Activerecord", même concept, un modèle est lié à une table de base de données (techniquement, le modèle représente une ligne dans la table)

Donc si vous les voulez vraiment, ajoutez-les, sinon laissez-les

MAIS, je pense qu'avoir un fichier Gem correct et des cas de test est essentiel

bienvenue dans Rails

HTH

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X