Ich versuche, Hash-Mapping-IDs für eine Reihe von Versuchen in meiner Rails-App zu speichern. Meine Migration in die Datenbank, um diese neue Spalte aufzunehmen:
class AddMultiWrongToUser < ActiveRecord::Migration
def self.up
add_column :users, :multi_wrong, :string
end
def self.down
remove_column :users, :multi_wrong
end
end
In meinem Modell habe ich:
class User < ActiveRecord::Base
serialize :multi_wrong, Hash
end
Aber wenn ich die Rails-Konsole benutze, um dies zu testen, indem ich Folgendes mache:
user = User.create()
user.multi_wrong = {"test"=>"123"}
user.save
Die Ausgabe ist falsch. Was läuft hier falsch?
ruby-on-rails
ruby
serialization
activerecord
cmwright
quelle
quelle
Antworten:
Der Spaltentyp ist falsch. Sie sollten Text anstelle von String verwenden. Daher sollte Ihre Migration wie folgt sein:
Dann konvertiert Rails es für Sie ordnungsgemäß in YAML (und führt die ordnungsgemäße Serialisierung durch). Zeichenfolgenfelder sind in ihrer Größe begrenzt und enthalten nur besonders kleine Werte.
quelle
AKTUALISIERT:
Genaue Umsetzung auf Ihrer Datenbank ab, sondern PostgreSQL hat jetzt
json
undjsonb
Spalten , die Ihre Hash - nativ speichern kann / Objektdaten und ermöglicht es Ihnen , zu Abfrage für die JSON mit Active !Ändern Sie Ihre Migration und Sie sind fertig.
ORIGINAL:
Für weitere Details: Rails Docs && Apidock
Stellen Sie sicher, dass Ihre Spalte ist
:text
und nicht:string
Migration:
$ rails g migration add_location_data_to_users location_data:text
sollte erstellen:
Ihre Klasse würde aussehen wie:
Mögliche Aktionen:
Mehr genial?!
Verwenden Sie den Postgresql-Shop
Mit hstore können Sie Attribute für das serialisierte Feld festlegen
quelle
Rails 4 verfügt über eine neue Funktion namens Store , mit der Sie Ihr Problem problemlos lösen können. Sie können einen Accessor dafür definieren. 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:
quelle