我有以下型号:
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]
,但我似乎没有在我的回复中获得嵌套输出。我只获得网站 - &gt;帐户包含user_id的帐户。
答案 0 :(得分:1)
您有几个选择:
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