首页 > 解决方案 > Rails with Grape API - params 中的关系 id 作为过滤器

问题描述

在我的 Rails/Grape API 应用程序中,我有一个端点,我在其中列出了所有用户注释。模型Note与模型具有可选关系Activity(注释可以是活动的一部分,如下所示)。

class Note < ApplicationRecord
  belongs_to :user
  belongs_to :activity, optional: true
end

我的端点如下所示:

module Notes
  class Index < Base
    desc 'All user notes',
         success: { code: 200 },
         failure: [
           { code: 401, message: 'The access token is invalid' },
           { code: 401, message: 'The access token expired' },
           { code: 404, message: "Couldn't find Notes" },
         ]

    get do
      ::DetailedSerializer.new(
        Note.where(user_id: current_user.id),
      )
    end
  end
end

我想按活动过滤笔记(例如仅显示笔记activities_id = 1)。为此,我需要activities_id在参数中使用作为过滤器,但我不知道此类操作的语法是什么,如何实现?

标签: ruby-on-railsrubygrape

解决方案


在您的葡萄 API 中获取参数的语法:-

desc 'Your description.'
params do
   requires :id, type: Integer, desc: 'Model ID.'
end
get do
   Model.find(params[:id])
end

所以根据你的代码: -

class Index < Base
    desc 'All user notes',
         success: { code: 200 },
         failure: [
           { code: 401, message: 'The access token is invalid' },
           { code: 401, message: 'The access token expired' },
           { code: 404, message: "Couldn't find Notes" },
         ]
    params do
      optional :activity_id, type: Integer, desc: 'Activity filter.'
    end
    get do
     ## then you can use this id for filter in your query
      puts "activity_id ====> #{params[:activity_id]} " 

      ::DetailedSerializer.new(
        Note.where(user_id: current_user.id),
      )
    end
  end

您可以制作此参数optionalrequires:-

params do
   optional :activity_id, type: Integer, desc: 'Activity filter.'
end

或者

params do
   requires :activity_id, type: Integer, desc: 'Activity filter.'
end

推荐阅读