68 votes

Ajouter un attribut virtuel à la sortie JSON

Disons que j'ai une application qui gère une liste de choses à faire. La liste a finis et semi-finis des éléments. Maintenant, je veux ajouter deux champs virtuels à la liste d'objet; le comte de finis et semi-finis des éléments dans la liste. J'ai aussi besoin de ces derniers à être affiché dans la sortie json.

J'ai deux méthodes dans mon modèle qui récupère semi-finis/éléments finis:

def unfinished_items 
  self.items.where("status = ?", false) 
end 

def finished_items 
  self.items.where("status = ?", true) 
end

Alors, comment puis-je obtenir le nombre de ces deux méthodes dans mon sortie json?

Je suis à l'aide de Rails 3.1

Meilleures Salutations Linus

118voto

mu is too short Points 205090

La sérialisation d'objets dans les Rails se fait en deux étapes:

  • Tout d'abord, as_json est appelé à convertir l'objet d'une procédure simplifiée de Hachage.
  • Ensuite, to_json est appelée sur l' as_json de la valeur de retour pour obtenir la dernière chaîne JSON.

En général, vous voulez quitter to_json seulement, de sorte que tout ce que vous devez faire est d'ajouter vos propres as_json mise en œuvre un peu comme ceci:

def as_json(options = { })
    # just in case someone says as_json(nil) and bypasses
    # our default...
    super((options || { }).merge({
        :methods => [:finished_items, :unfinished_items]
    }))
end

Vous pouvez aussi faire comme ceci:

def as_json(options = { })
    h = super(options)
    h[:finished]   = finished_items
    h[:unfinished] = unfinished_items
    h
end

si vous souhaitez utiliser des noms différents pour la méthode adossés à des valeurs.

Si vous vous souciez de XML et JSON, jetez un oeil à l' serializable_hash.

19voto

randomor Points 1009

Une autre façon de le faire est d'ajouter ceci à votre modèle:

def attributes
  super.merge({'unfinished' => unfinished_items, 'finished' => finished_items})
end

Ce serait également automatiquement de travail pour la sérialisation xml. http://api.rubyonrails.org/classes/ActiveModel/Serialization.html Sachez cependant, vous pourriez vouloir utiliser des chaînes pour les clés, puisque la méthode ne peut pas traiter avec des symboles lors du tri des clés dans rails 3. Mais il n'est pas triés dans les rails 4, donc il ne devrait pas être plus un problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X