Gibt es eine Ruby- oder ActiveRecord-Methode, die einen Hash in und aus einem Datenbankfeld schreiben und lesen kann?
Ich muss ein Web-Dienstprogramm schreiben, um POST-Daten zu akzeptieren und sie in einer Datenbank zu speichern, um sie später aus der Datenbank in ihrer ursprünglichen Hash-Form zu ziehen. Aber idealerweise ohne zu wissen, was die Struktur ist. Mit anderen Worten, mein Datenspeicher muss unabhängig von einem bestimmten Satz von Hash-Schlüsseln sein.
Zum Beispiel könnte die externe App einmal an meine App senden:
%Vor%Aber ein anderes Mal könnte die externe App an meine App senden:
%Vor% Also muss mein Dienstprogramm einen beliebigen Hash in einem text
-Feld in der Datenbank speichern und später den Hash aus dem, was gespeichert wurde, neu erstellen.
Sie können die Serialisierung mit 3 Optionen verwenden: Marshal in Binärformat, YAML und JSON für Menschen lesbare Formate von Daten speichern.
Sobald Sie jede der Methoden ausprobieren, vergessen Sie nicht, die Zeit zu messen, die Sie serialisieren und deserialisieren möchten. Wenn Sie Daten im Ursprungsformat zurückholen müssen, ist JSON die richtige Wahl, da Sie sie nicht deserialisieren müssen, sondern sie selbst als Zeichenfolge verwenden müssen.
Rails 4 fügt Unterstützung für den Postgres hstore
-Datentyp hinzu, mit dem Sie Hashes direkt in Ihre (Postgres-) Datenbank einfügen können.
Wenn Sie Rails 4 und Postgres verwenden, können Sie in Ihrer Migration hstore
verwenden:
Dieser Ausführungsbefehl aktiviert hstore in Postgres, Sie müssen das also nur einmal tun.
Damit können Sie einen Hash in :column
speichern, genau wie bei jedem anderen Datentyp.
Dafür gibt es zwei Möglichkeiten:
Das Problem mit dem ersten Ansatz ist, dass das Finden und Manipulieren schwierig und teuer ist. Geben Sie zum Beispiel eine "0" vor der Telefonnummer aller Mitarbeiter ein, die in Foo Inc. arbeiten, ein Albtraum, verglichen mit dem Speichern der Daten in einem regulären Tabellenformat.
Ihr Schema wäre:
%Vor%Also, um
zu speichern %Vor%Sie würden tun:
%Vor%Nachteile dieses Ansatzes: Rails unterstützt diese Art von Schema nicht nativ.
Sie suchen nach Serialisierung . Es wird Ihnen helfen, genau das zu tun, was Sie wollen.
Rails 4 hat eine neue Funktion namens Store , mit der Sie Ihr Problem einfach lösen können . Sie können einen Accessor dafür definieren, und es wird empfohlen, die für den serialisierten Speicher verwendete Datenbankspalte als Text zu deklarieren, damit genügend Platz vorhanden ist. Das ursprüngliche Beispiel:
%Vor%Tags und Links ruby activerecord hash