À l'aide de Rails de sérialiser pour enregistrer hash à la base de données
Je suis essayez d'enregistrer un hachage de la cartographie des id pour un certain nombre de tentatives dans mon application rails. Ma migration de la base de données pour accueillir cette nouvelle colonne:
class AddMultiWrongToUser < ActiveRecord::Migration
def self.up
add_column :users, :multi_wrong, :string
end
def self.down
remove_column :users, :multi_wrong
end
end
Dans mon modèle que j'ai:
class User < ActiveRecord::Base
serialize :multi_wrong, Hash
end
Mais lorsque j'utilise la console rails pour tester ça en faisant:
user = User.create()
user.multi_wrong = {"test"=>"123"}
user.save
La sortie est faux. Ce qui ne va pas ici?
- Est-il quelque chose à l'utilisateur.les erreurs après avoir tenté de l'enregistrer?
- Dans l'avenir, vous pouvez utiliser le bang méthode (sauver!!!) pour soulever une exception à la règle et affiche un message d'erreur.
- Meilleure réponse utilise maintenant un JSON de la colonne stackoverflow.com/a/21397522/1536309
Vous devez vous connecter pour publier un commentaire.
Le type de colonne est faux. Vous devez utiliser le Texte au lieu de String. Par conséquent, la migration devrait être:
Alors que les Rails correctement le convertir dans le format YAML pour vous (et correctement sérialisation). Les chaînes de champs sont limitées en taille et ne tenez surtout les petites valeurs.
Mise à JOUR:
Exacte de la mise en œuvre dépendra de votre base de données, mais PostgreSQL a maintenant
json
etjsonb
colonnes qui peuvent nativement stocker vos hash/objet de données et vous permettent de requête contre le JSON avec ActiveRecord!changement de la migration, et vous avez terminé.
ORIGINAL:
Pour plus de détails: rails docs && apidock
Assurez-vous que votre colonne est
:text
et pas:string
Migration:
$ rails g migration add_location_data_to_users location_data:text
devrait créer:
Votre Classe Devrait Ressembler À:
Actions Disponibles:
Plus Génial?!
utiliser postgresql hstore
Avec hstore vous pouvez définir des attributs sur la sérialisé champ
Rails 4 a une nouvelle fonctionnalité appelée Magasin, de sorte que vous pouvez facilement l'utiliser pour résoudre votre problème. Vous pouvez définir un accesseur pour elle et il est recommandé de déclarer la colonne de base de données utilisé pour la sérialisé magasin comme un texte, il y a donc beaucoup de place. L'exemple d'origine: