簡體   English   中英

Ruby / Rails中的嵌套JSON響應

[英]Nested JSON Response in Ruby/Rails

我有以下型號:

class Account < ActiveRecord::Base
  belongs_to :user
  has_and_belongs_to_many :sites

class User < ActiveRecord::Base
  has_many :accounts

class Site < ActiveRecord::Base
  has_and_belongs_to_many :accounts

我正在嘗試返回一個Site的JSON表示形式,其中列出了所有嵌套在其中的Accounts信息和User信息。

我將as_json添加到Site到:include => [:accounts] ,並將相同的方法添加到Account到:include => [:user]但是我的響應似乎沒有嵌套的輸出。 我只得到Site-> Account,其中Account包含user_id。

您有幾種選擇:

  1. site.as_json(include: {accounts: {include: :user}}) 在此處查看有關用法的更多信息: http : //api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html

  2. 覆蓋serializable_hash方法。 缺點是,每次調用to_json它都會啟動,並且您可能希望根據用例每次都以不同的方式對Site進行序列化。

  3. Site上創建自己的自定義方法,例如my_serialized_site ,它將返回所需的Hash結構。 然后,您可以調用site.my_serialized_site.to_json 您可能還想創建一個包含要包含的所有內容的范圍,然后調用: Site.my_all_inclusive_scope.map{|x| x.my_serialized_site.to_json} Site.my_all_inclusive_scope.map{|x| x.my_serialized_site.to_json}

您還可以讓每個對象將自定義序列化委托給依賴項。

例如:

class Site
  scope :my_all_inclusive_scope, -> { includes(accounts: :user) }

  def my_serialized_site
    {id: self.id, accounts: {accounts.map(&:my_serialized_account)}}
  end
end

class Account
  def my_serialized_account
    {id: self.id, user: {user.my_serialized_user}}
  end
end

class User
  def my_serialized_user
    { id: self.id, name: name }
  end
end
  1. 您可能要在這里查看ActiveModel::Serializerhttps : //github.com/rails-api/active_model_serializers

  2. 或在這里查看rablhttps//github.com/nesquena/rabl

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM