![](/img/trans.png)
[英]Ruby on Rails: Best way to go trough a nested API JSON Response
[英]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。
您有几种选择:
site.as_json(include: {accounts: {include: :user}})
。 在此处查看有关用法的更多信息: http : //api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html
覆盖serializable_hash
方法。 缺点是,每次调用to_json
它都会启动,并且您可能希望根据用例每次都以不同的方式对Site
进行序列化。
在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
您可能要在这里查看ActiveModel::Serializer
: https : //github.com/rails-api/active_model_serializers
或在这里查看rabl
: https : //github.com/nesquena/rabl
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.