繁体   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