Domanda

Ricevo alcuni oggetti da una libreria esterna e ho bisogno di archiviarli in un database. Esiste un modo per creare tabelle e relazioni a partire dagli oggetti o devo scavare in essi e creare manualmente migrazioni e modelli?

Grazie! Roberto

È stato utile?

Soluzione

Anche se potessi creare dinamicamente tabelle al volo in quel modo (senza dire che puoi). Non vorrei farlo. C'è così tanto potenziale di errore lì.

Vorrei creare manualmente le migrazioni e avere tabelle e campi pre-creati e riempirli con le righe necessarie.

Altri suggerimenti

Nota: questo è un hack TERRIBILE e staccherai i bug per gli anni a venire, ma è comunque abbastanza facile:

Questo si basa su binari ActiveSupport e ActiveRecord già caricati

Supponi di ottenere un oggetto casuale da una libreria di terze parti che ha 2 variabili di istanza: la sua classe potrebbe apparire così:

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

Puoi usare la riflessione per capire il nome e le colonne:

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

Quindi puoi usare le migrazioni ActiveRecord per creare la tua tabella, in questo modo:

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

Quindi puoi finalmente dichiarare una classe activerecord che si interfaccia con la tabella appena creata.

# 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!

Ora puoi farlo:

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

PS: non farlo!

Oltre ad essere terribile, se la tua app rails si riavvia perderà tutto il concetto delle Classi Generate, quindi dovrai escogitare un meccanismo per perseverare anche quelle.

Ho questa situazione esatta. Devo leggere i dati esterni all'applicazione e l'hit di prestazioni è così grande, che memorizzo localmente. Ho scelto una soluzione in cui, nel tempo, ho sviluppato manualmente uno schema e migrazioni che funzionano con i dati e mi consentono di conservare i dati nelle tabelle. Ho sviluppato uno schema di memorizzazione nella cache che funziona per i miei dati e le prestazioni sono aumentate in modo significativo.

Detto questo, ho fatto tutto a mano e non me ne pento. Posso avere fiducia che il mio database è stabile e che non sto ricreando le tabelle db al volo. Per questo motivo, non ho alcuna preoccupazione per la stabilità della mia domanda.

A seconda di cosa si sta tentando di fare con gli oggetti, è possibile archiviare gli oggetti direttamente nel database serializzando loro.

Prova ad esaminare alcune soluzioni ORM. O memorizza come XML.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top