Question

Je récupère des objets dans une bibliothèque externe et je dois les stocker dans une base de données. Existe-t-il un moyen de créer les tables et les relations à partir des objets, ou je dois les creuser pour créer des migrations et des modèles à la main?

Merci! Roberto

Était-ce utile?

La solution

Même si vous pouviez créer dynamiquement des tableaux à la volée comme cela (sans dire que vous le pouvez). Je ne voudrais pas faire ça. Il y a tellement de potentiel d'erreur ici.

Je créerais les migrations à la main, je créerais les tables et les champs et je les remplirais avec des lignes si nécessaire.

Autres conseils

Remarque: C’est un hack horrible et vous corrigerez les bugs pour les années à venir, mais c’est toutefois assez facile:

Cela repose sur les rails ActiveSupport et ActiveRecord déjà chargés

Supposons que vous obteniez un objet aléatoire d'une bibliothèque tierce comprenant 2 variables d'instance. Sa classe pourrait ressembler à ceci:

class Animal
    attr_accessor :name, :number_of_legs
end
a = SomeThirdPartyLibrary.get_animal

Vous pouvez utiliser la réflexion pour déterminer son nom et les colonnes:

table_name = a.class.to_s.tableize
column_names = a.instance_variables.map{ |n| n[1..-1] } # remove the @
column_types = a.instance_variables.map{ |n| a.instance_variable_get(n).class 
    }.map{ |c| sql_type_for_class(c) } # go write sql_type_for_class please

Vous pouvez ensuite utiliser les migrations ActiveRecord pour créer votre table, comme suit:

ActiveRecord::Migration.class_eval do
  create_table table_name do |t|
    column_names.zip(column_types).each do |colname, coltype|
      t.column colname, coltype
    end
  end
end

Ensuite, vous pouvez enfin déclarer une classe activerecord qui se connectera ensuite à la table que vous venez de créer.

# Note we declare a module so the new classes don't conflict with the existing ones
module GeneratedClasses; end
eval "class GeneratedClasses::#{a.class} < ActiveRecord::Base; end"

Presto!

Vous pouvez maintenant faire ceci:

a = GeneratedClasses::Animal.new
a.update_attributes whatever
a.save

PS: ne faites pas ça!

Hormis le fait d'être horrible, si votre application rails redémarre, elle perdra tout concept des classes générées. Vous devrez donc mettre au point un mécanisme permettant de les conserver également.

J'ai cette situation exacte. Je dois lire des données externes à l'application et l'impact sur les performances est si important que je le stocke localement. J'ai opté pour une solution dans laquelle, au fil du temps, j'ai développé un schéma et des migrations à la main, qui fonctionnent avec les données et me permettent de les conserver dans les tables. J'ai développé un schéma de mise en cache qui fonctionne pour mes données et les performances ont considérablement augmenté.

Tout ça pour dire, j'ai tout fait à la main et je ne le regrette pas. Je peux avoir confiance que ma base de données est stable et que je ne recrée pas les tables de base de données à la volée. Pour cette raison, je ne m'inquiète pas de la stabilité de mon application.

En fonction de ce que vous essayez de faire avec les objets, vous pouvez stocker des objets directement dans la base de données en en les sérialisant .

Essayez d’examiner certaines solutions ORM. Ou stocker en XML.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top