2015-11-13 179 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

  • 相關問題