使用Grape在Rails应用程序中包含关系

时间:2018-03-26 21:41:05

标签: ruby-on-rails grape grape-api

我在API中返回资源(我使用Grape),但我还想返回关系对象(就像ember应用程序所期望的那样包含对象)。我怎样才能做到这一点?我的序列化器如下:

class JudgeSerializer < ActiveModel::Serializer
    attributes :ID, :FIRST_NAME, :LAST_NAME, :FULL_NAME
end

我的模特:

class Judge < ApplicationRecord
    self.primary_key = 'id'
    self.table_name = 'judge'
    has_many :judgecourts, class_name: 'Judgecourt', primary_key: 'ID',foreign_key: 'JUDGE_ID'
end

我以这种方式返回此资源:

desc 'Return a specific judge'
route_param :id do
  get do
    judge = Judge.find(params[:id])
    present judge
  end
end

生成这样的东西会很好:

data
:
{type: "judges", id: "1", attributes: {…}, relationships: {…}}
included
:
Array(1)
0
:
{type: "judgecourts", id: "1", attributes: {…}}

1 个答案:

答案 0 :(得分:0)

看来您的问题中有两个主题:

1。如何在ActiveModelSerializer

中包含关系

通过调整活动模型序列化程序并添加关系,可以非常轻松地完成此操作,以便ActiveModelSerializer知道它必须包含序列化对象中的关系:

class JudgeSerializer < ActiveModel::Serializer
  attributes :ID, :FIRST_NAME, :LAST_NAME, :FULL_NAME

  has_many :judgecourts
end

这会在序列化的json中自动提供judgecourts关系。经典Post/Comment对象的示例:

Attributes adapter : a post with one comment

2。使用特定格式......

您指定的格式与JSON:API格式非常相似。如果这是您真正想要实现的目标,那么最好使用JSON:API适配器内置ActiveModelSerializer。为此,您需要告诉AMS使用适当的适配器,可能通过初始化文件:

# ./initializers/active_model_serializer.rb
ActiveModelSerializers.config.adapter = :json_api

在此之后,您的json应该按照您期望的方式进行格式化。我不是json api规范的专家,所以可能还有一些东西需要调整。您将能够在ActiveModelSerializers wiki page on adapters, section JSON API中找到有关此适配器的更多信息。

以下是我使用Post/Comment示例获得的内容:

json_api adapter : a post with one comment

请注意,还有其他专门针对JSON API规范而构建的gem,例如jsonapi-rb和Netflix Fast JSON API。他们可能会对你感兴趣。