[Rails] ActiveModel :: Sérialiseurs avec ou sans imbrication explicite

Qu'est-ce que c'est ça

Lors de l'utilisation de Rails ActiveModel :: Serializers Lorsque vous souhaitez rendre deux objets json, vous pouvez les imbriquer dans un seul ou non. Cet article est rédigé comme un mémorandum pour moi-même.

Ce que vous pouvez obtenir de cet article

Lors de l'écriture du code suivant dans une méthode Rails, l'objet que vous souhaitez imbriquer Vous saurez jouer avec comme vous le souhaitez.

users_controller.rb


render json: { hoge: hoge, fuga: fuga }, include: :piyo

répondre

La solution est d'utiliser la méthode Rails''as_json`!

environnement

Ruby 2.6 Rails 6.0 active_model_serializers 0.10.10

supposition

Il existe les quatre modèles suivants.

l'utilisateur et l'installation sont 1: N, Le modèle de produit et le modèle utilisateur ne sont pas associés. Je n'ai pas besoin d'une colonne cette fois, je vais donc l'omettre.

user.rb


class User < ApplicationRecord
  belongs_to :facility
end

facility.rb


class Facility < ApplicationRecord
  has_many :users
end

product.rb


class Product < ApplicationRecord
  #Aucune association
end

Statut

Lors de l'appel des utilisateurs # show action Vous devez rendre à la fois les objets utilisateur et produits, Vous devez également récupérer l'objet imbriqué pour l'utilisateur.

Erreur réellement rencontrée

users_controller.rb


  def show
    user = User.find(params[:id])
    products = Product.all
    render json: { user: user, products: products }, include: ['facility']
  end

Lorsque j'écris dans le code ci-dessus et que je reçois une réponse, j'obtiens l'erreur suivante!

NoMethodError (undefined method `facility' for #<Product:0x00007fed8d885518>):

Clarifié pour inclure dans l'objet json à rendre. Mais avec le style d'écriture ci-dessus La fonction est imbriquée à la fois dans l'objet utilisateur et dans l'objet produits. Étant donné que le modèle de produits et le modèle d'installation ne forment pas une association, Bien sûr, il n'y a pas de telle méthode (modèle?), Alors Rails dit, "facilité? Je ne connais pas une telle méthode!"

Alors que faire

Conclusion

Utilisez la méthode as_json pour formater json au moment de l'affectation des variables, Spécifiez que le modèle d'installation doit être imbriqué avec include.

users_controller.rb


  def show
    user = User.find(params[:id]).as_json(include: 'facility')
    products = Product.all
    render json: {user: user, products: products}, status: :ok
  end

Cela vous permet d'imbriquer le modèle d'installation uniquement dans l'utilisateur variable.

Version avancée

Si vous dites: "Je n'ai pas besoin d'un modèle d'installation, je veux donc obtenir des données sans imbriquer le modèle d'installation!", Faites ceci.

users_controller.rb


  def show
    user = User.find(params[:id]).as_json
    products = Product.all
    render json: {user: user, products: products}, status: :ok
  end

Je sais comment l'écrire, mais honnêtement, je ne sais pas pourquoi json est formaté sans être imbriqué. Y a-t-il des moments où il est imbriqué et des moments où il ne l'est pas? Vérification requise ici

Bonus: Les options as_json sont expliquées en détail dans l'article Liste des options ActiveModel as_json. Merci ~

Cliquez ici pour la documentation officielle de la méthode Rails as_json: https://railsdoc.com/page/as_json

Recommended Posts

[Rails] ActiveModel :: Sérialiseurs avec ou sans imbrication explicite
Type de classe interne: avec ou sans statique