Frage

Ich erhalte einige Objekte aus einer externen Bibliothek, und ich brauche diese Objekte in einer Datenbank zu speichern. Gibt es eine Möglichkeit, die Tabellen und Beziehungen ausgehend von den Objekten zu erstellen, oder ich habe in sie zu graben und erstellen Migrationen und Modelle von Hand?

Danke! Roberto

War es hilfreich?

Lösung

Auch wenn Sie dynamisch Tabellen on the fly wie das schaffen könnten (nicht sagen, dass Sie können). Ich möchte nicht, dass zu tun. Es gibt so viel Potenzial für Fehler gibt.

Ich würde die Migration von Hand erstellen und habe die Tabellen und Felder bereits erstellten und fülle sie mit Zeilen je nach Bedarf.

Andere Tipps

Hinweis: Dies ist eine schreckliche Hack und Sie werden die Fehler seit Jahren Ausbügelung kommen, aber es ist jedoch recht einfach:

Dieses stützt sich auf Schienen Active und Active bereits geladen

Sagen Sie bitte ein zufälliges Objekt von einem Dritten Bibliothek erhalten, die 2 Instanzvariablen hat - seine Klasse könnte wie folgt aussehen:

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

Sie können mit Reflexion seinen Namen, um herauszufinden, und Spalten:

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

Dann können Sie Active Migrationen verwenden, um Ihre Tabelle zu erstellen, wie folgt aus:

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

Dann können Sie endlich eine Active Klasse deklarieren, die dann mit der soeben erstellten Tabelle Schnittstelle werden.

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

Jetzt können Sie dies tun:

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

PS: Tu das nicht

Neben schrecklich sein, wenn Ihre Rails-Anwendung neu gestartet wird alles Konzept der Generierte Klassen verlieren, so dass Sie die von persistierenden auch einen Mechanismus zu entwickeln, benötigen.

Ich habe diese genaue Situation. Ich muss Daten außerhalb der Anwendung lesen und die Leistungseinbußen so groß ist, dass ich lokal speichern. Ich habe mit einer Lösung gegangen, wo ich im Laufe der Zeit ein Schema und Migrationen von Hand entwickelt, dass die Arbeit mit den Daten, und erlauben Sie mir, die Daten in den Tabellen bestehen bleiben. Ich habe ein Caching-Schema entwickelt, das für meine Daten und die Leistung arbeitet deutlich erhöht.

Alles zu sagen, ich habe alles von Hand und ich bereue es nicht. Ich kann darauf vertrauen, dass meine Datenbank stabil ist und dass ich nicht neu erstellen db Tabellen on the fly. Aus diesem Grund habe ich keine Sorge um die Stabilität meiner Anwendung.

Je nachdem, was Sie versuchen, mit den Objekten zu tun, können Sie Objekte speichern direkt in die Datenbank von Serialisierung sie.

Versuchen Sie, bei einigen ORM Lösungen suchen. Oder speichern als XML.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top