[Rails] ActiveModel :: Serializers mit oder ohne explizite Verschachtelung

was ist das

Bei Verwendung von Rails ActiveModel :: Serializers Wenn Sie zwei JSON-Objekte rendern möchten, können Sie sie nur in einem verschachteln oder nicht. Dieser Artikel ist als Memorandum für mich geschrieben.

Was Sie aus diesem Artikel erhalten können

Wenn Sie den folgenden Code in eine Rails-Methode schreiben, das Objekt, das Sie verschachteln möchten Sie werden wissen, wie Sie damit spielen können, wie Sie möchten.

users_controller.rb


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

Antworten

Die Lösung besteht darin, die Rails'as_json-Methode zu verwenden!

Umgebung

Ruby 2.6 Rails 6.0 active_model_serializers 0.10.10

Annahme

Es gibt die folgenden vier Modelle.

Benutzer und Einrichtung sind 1: N, Das Produktmodell und das Benutzermodell sind nicht zugeordnet. Ich brauche diesmal keine Kolumne, also werde ich sie weglassen.

user.rb


class User < ApplicationRecord
  belongs_to :facility
end

facility.rb


class Facility < ApplicationRecord
  has_many :users
end

product.rb


class Product < ApplicationRecord
  #Keine Assoziation
end

Status

Beim Aufruf der Benutzer # show action Sie müssen sowohl das Benutzer- als auch das Produktobjekt rendern. Sie müssen auch das verschachtelte Objekt für den Benutzer abrufen.

Tatsächlich aufgetretener Fehler

users_controller.rb


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

Wenn ich den obigen Code schreibe und eine Antwort erhalte, erhalte ich den folgenden Fehler!

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

Es wurde klargestellt, dass es in das zu rendernde JSON-Objekt aufgenommen werden soll. Aber mit dem obigen Schreibstil Die Einrichtung ist sowohl im Benutzerobjekt als auch im Produktobjekt verschachtelt. Da das Produktmodell und das Anlagenmodell keine Assoziation bilden, Natürlich gibt es keine solche Methode (Modell?) Rails sagt: "Einrichtung? Ich kenne eine solche Methode nicht!"

Was ist dann zu tun

Fazit

Verwenden Sie die as_json-Methode, um json zum Zeitpunkt der Zuweisung von Variablen zu formatieren. Geben Sie an, dass das Einrichtungsmodell mit include verschachtelt werden soll.

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

Auf diese Weise können Sie das Einrichtungsmodell nur im variablen Benutzer verschachteln.

Erweiterte Version

Wenn Sie sagen: "Ich benötige kein Einrichtungsmodell, möchte also Daten abrufen, ohne das Einrichtungsmodell zu verschachteln!", Führen Sie dies aus.

users_controller.rb


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

Ich weiß, wie man es schreibt, aber ehrlich gesagt weiß ich nicht, warum json formatiert ist, ohne verschachtelt zu sein. Gibt es Zeiten, in denen es verschachtelt ist und Zeiten, in denen es nicht verschachtelt ist? Überprüfung hier erforderlich

Bonus: Die as_json-Optionen werden im Artikel ActiveModel as_json-Optionsliste ausführlich erläutert. Danke ~

Klicken Sie hier, um die offizielle Dokumentation der Rails as_json-Methode anzuzeigen: https://railsdoc.com/page/as_json

Recommended Posts

[Rails] ActiveModel :: Serializers mit oder ohne explizite Verschachtelung
Interner Klassentyp: Mit oder ohne Statik