Ruby on rails Ruby/Rails中的嵌套JSON响应

Ruby on rails Ruby/Rails中的嵌套JSON响应,ruby-on-rails,ruby,json,Ruby On Rails,Ruby,Json,我有以下型号: class Account < ActiveRecord::Base belongs_to :user has_and_belongs_to_many :sites 类帐户帐户,其中帐户包含用户id。您有几个选项: site.as_json(include:{accounts:{include::user}})。有关用法的更多信息,请参见此处: 重写serializable_hash方法。缺点是,每次调用到_json时,它都会启动,并且您可能希望每次根据用例对站点

我有以下型号:

class Account < ActiveRecord::Base
  belongs_to :user
  has_and_belongs_to_many :sites
类帐户

class用户

类站点
我试图返回一个站点的JSON表示,其中列出了所有帐户信息和嵌套在其中的用户信息


我将
作为json
添加到站点的
:include=>[:accounts]
中,并将相同的方法添加到
:include=>[:user]
中,但是我的响应中似乎没有得到嵌套的输出。我只获得站点->帐户,其中帐户包含用户id。

您有几个选项:

  • site.as_json(include:{accounts:{include::user}})
    。有关用法的更多信息,请参见此处:

  • 重写
    serializable_hash
    方法。缺点是,每次调用
    到_json
    时,它都会启动,并且您可能希望每次根据用例对
    站点
    进行不同的序列化

  • 站点
    上创建自己的自定义方法,例如
    我的序列化站点
    ,它将返回所需的
    哈希
    结构。然后您可以调用
    site.my\u serialized\u site.to\u json
    。您可能还希望创建一些范围,其中包含您希望包含的所有内容,然后调用:
    Site.my|u all_inclusive_scope.map{x|x.my_序列化_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

  • 或者在这里查看
    rabl


  • 您确定
    site.as_json(include:{accounts:{include::user}})
    不起作用吗?我在一个类似的结构上试过这个,它对我有效。这确实有效。我没有像您那样嵌套as_json方法。谢谢!
    class Site < ActiveRecord::Base
      has_and_belongs_to_many :accounts
    
    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