2015-11-13 122 views
0

我有以下型号:嵌套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。

+0

你确定'site.as_json(incl ude:{accounts:{include::user}})'不起作用?我在类似的结构上试过这个,它适用于我。 – AmitA

+0

这是行不通的。我没有像你所做的那样嵌套as_json方法。谢谢! – user3186332

回答

1

您有几种选择:

  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}

您也可以在每个对象授予您的自定义序列化到家属。

例如:

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

  • 相关问题