J'essaie d'enregistrer un identifiant de mappage de hachage pour un certain nombre de tentatives dans mon application rails. Ma migration vers 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, j'ai:
class User < ActiveRecord::Base
serialize :multi_wrong, Hash
end
Mais quand j'utilise la console rails pour tester cela en faisant:
user = User.create()
user.multi_wrong = {"test"=>"123"}
user.save
La sortie est fausse. Qu'est-ce qui ne va pas ici?
ruby-on-rails
ruby
serialization
activerecord
cmwright
la source
la source
Réponses:
Le type de colonne est incorrect. Vous devez utiliser Text au lieu de String. Par conséquent, votre migration doit être:
Ensuite, Rails le convertira correctement en YAML pour vous (et effectuera une sérialisation appropriée). Les champs de chaînes sont limités en taille et ne contiennent que des valeurs particulièrement petites.
la source
ACTUALISÉ:
La mise en œuvre exacte dépendra de votre base de données, mais PostgreSQL a maintenant
json
etjsonb
colonnes qui peuvent stocker nativement vos données de hachage / objet et vous permettent de requête contre le JSON avec ActiveRecord !changez votre migration et vous avez terminé.
ORIGINAL:
Pour plus de détails: rails docs && apidock
Assurez-vous que votre colonne est
:text
et non:string
Migration:
$ rails g migration add_location_data_to_users location_data:text
devrait créer:
Votre classe ressemblerait à:
Actions disponibles:
Plus génial?!
utiliser postgresql hstore
Avec hstore, vous pouvez définir des attributs sur le champ sérialisé
la source
Rails 4 a une nouvelle fonctionnalité appelée Store , vous pouvez donc facilement l'utiliser pour résoudre votre problème. Vous pouvez définir un accesseur pour celui-ci et il est recommandé de déclarer la colonne de base de données utilisée pour le magasin sérialisé sous forme de texte, il y a donc beaucoup de place. L'exemple original:
la source