Ruby / Rails中的嵌套JSON响应

时间:2015-11-13 21:49:33

标签: ruby-on-rails ruby 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],但我似乎没有在我的回复中获得嵌套输出。我只获得网站 - &gt;帐户包含user_id的帐户。

1 个答案:

答案 0 :(得分: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}

  4. 您还可以让每个对象将自定义序列化委派给依赖者。

    例如:

    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
    
    1. 您可以在此处查看ActiveModel::Serializerhttps://github.com/rails-api/active_model_serializers

    2. 或者在这里查看rablhttps://github.com/nesquena/rabl