J'ai l'objet suivant qui a été créé
@post = Post.create(:name => 'test', :post_number => 20, :active => true)
Une fois que cela est enregistré, je veux être en mesure de récupérer l'objet dans un hachage, par exemple en faisant quelque chose comme:
@object.to_hash
Comment est-ce possible depuis les rails?
ruby-on-rails
ruby
Ben Morgan
la source
la source
.to_json
interrogera la base de données si le modèle n'est pas completjoins
etselect
,Person.joins(:address).select("addresses.street, persons.name").find_by_id(id).attributes
reviendra{ street: "", name: "" }
as_json
, il appelleraserializable_hash
qui, à son tour, appelleraattributes
! Donc, votre conseil ajoute en fait deux couches de complexitéattributes
, ce qui le rend encore plus cher..as_json
sérialisera l'objet en ruby hashDans la version la plus récente de Rails (je ne peux pas dire laquelle exactement), vous pouvez utiliser la
as_json
méthode:Sortira:
Pour aller un peu plus loin, vous pouvez remplacer cette méthode afin de personnaliser la façon dont vos attributs apparaissent, en faisant quelque chose comme ceci:
Ensuite, avec la même instance que ci-dessus, affichera:
Cela signifie bien sûr que vous devez spécifier explicitement les attributs qui doivent apparaître.
J'espère que cela t'aides.
ÉDITER :
Vous pouvez également vérifier la gemme Hashifiable .
la source
as_json a un moyen très flexible de configurer des objets complexes en fonction des relations de modèle
EXEMPLE
La campagne modèle appartient à la boutique et a une liste
La liste de modèles comporte de nombreuses list_tasks et chacune des list_tasks contient de nombreux commentaires
Nous pouvons obtenir un json qui combine toutes ces données facilement.
Remarquez les méthodes:: les balises peuvent vous aider à attacher tout objet supplémentaire qui n'a pas de relations avec d'autres. Il vous suffit de définir une méthode avec des tags de nom dans la campagne modèle . Cette méthode devrait renvoyer tout ce dont vous avez besoin (par exemple, Tags.all)
Documentation officielle pour as_json
la source
to_
variante semble fonctionner presque exactement de la même manière que laas_
variante, à l'exception de la sortie citée. La seule chose que je n'aimais pas, c'était de ne pas conserver l'ordre de mes critères de filtre. Il semble être trié par ordre alphabétique. Je pensais que c'était lié à la gemme awesome_print que j'ai dans mon environnement, mais je ne pense pas que ce soit le cas.Vous pouvez obtenir les attributs d'un objet de modèle renvoyés sous forme de hachage en utilisant soit
ou
as_json
vous permet d'inclure des associations et leurs attributs ainsi que de spécifier les attributs à inclure / exclure (voir documentation ). Cependant, si vous n'avez besoin que des attributs de l'objet de base, l'analyse comparative dans mon application avec ruby 2.2.3 et rails 4.2.2 montre que cela prendattributes
moins de la moitié du tempsas_json
.la source
Il y a de bonnes suggestions ici.
Je pense qu'il vaut la peine de noter que vous pouvez traiter un modèle ActiveRecord comme un hachage comme ceci:
Par conséquent, au lieu de générer un hachage des attributs, vous pouvez utiliser l'objet lui-même comme hachage.
la source
Vous pouvez certainement utiliser les attributs pour renvoyer tous les attributs, mais vous pouvez ajouter une méthode d'instance à Post, l'appeler "to_hash" et lui faire renvoyer les données que vous souhaitez dans un hachage. Quelque chose comme
la source
Je ne sais pas si c'est ce dont vous avez besoin, mais essayez ceci dans la console ruby:
évidemment il vous renverra un hash en console. si vous voulez renvoyer un hachage à partir d'une méthode - au lieu de simplement "h" essayez d'utiliser "return h.inspect", quelque chose de similaire à:
la source
Ma solution:
la source
La réponse de Swanand est excellente.
si vous utilisez FactoryGirl, vous pouvez utiliser sa
build
méthode pour générer le hachage d'attribut sans la cléid
. par exemplela source
Ancienne question, mais fortement référencée ... Je pense que la plupart des gens utilisent d'autres méthodes, mais il y a en fait une
to_hash
méthode, elle doit être configurée correctement. Généralement, pluck est une meilleure réponse après les rails 4 ... répondant à cela principalement parce que j'ai dû chercher un tas pour trouver ce fil ou quelque chose d'utile et en supposant que les autres rencontrent le même problème ...Remarque: ne pas recommander cela à tout le monde, mais des cas extrêmes!
Depuis l'api ruby on rails ... http://api.rubyonrails.org/classes/ActiveRecord/Result.html ...
la source