to_json : inclure (include) des sous models et des méthodes dans la serialisation

Bon le to_json c'est cool mais il vous manque des informations dans votre sérialisation ? Pas de soucis il existe des options à to_json :

:include => :model_a_inclure(s) ou pour une méthode :methods => :ma_method

Par exemple si vous voulez sérialiser un product avec sa famille (product belongs_to family, family has_many products):

Product.find(1).to_json(:include => :family)

Si vous voulez sérialiser une famille avec ses products :

Family.first.to_json(:include => :products)

Ici to_json ne permet pas de faire des filtres sur les données (j'entends certains produits dans notre cas, il est possible de filtrer les champs voir en bas de l'article)

La méthode que j'ai utilisé pour filtrer les models :

Un scope dans produit qui ne récupère que les produits visibles :

scope, :visible, where(:visible => true)

Puis dans family, j'ajoute une méthode qui récupère ses produits visibles et les sérialisent.

def visible_products

   return JSON.parse(self.products.visible.to_json)

end

Enfin pour sérialiser, la méthode va appeler visible_products sur family :

Family.first.to_json(:methods => :visible_products)

(Voir l'article précédent pour le pretty print du JSON)

Enfin il est possible via :only et :except de virer des champs lors de la sérialisation.

Pour plus d'info la doc complete : https://ar.rubyonrails.org/classes/ActiveRecord/Serialization.html#M000049