![](/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.