嵌套JSON响应
问题描述:
我有以下型号:嵌套JSON响应
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
我想返回站点的JSON表示列出所有帐户信息和内嵌的用户信息。
我将as_json
添加到网站到:include => [:accounts]
并添加了相同的方法帐户:include => [:user]
但是我似乎并没有得到我的回应中的嵌套输出。我只获取Site - >帐户,其中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}
您也可以在每个对象授予您的自定义序列化到家属。
例如:
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
你确定'site.as_json(incl ude:{accounts:{include::user}})'不起作用?我在类似的结构上试过这个,它适用于我。 – AmitA
这是行不通的。我没有像你所做的那样嵌套as_json方法。谢谢! – user3186332