【问题标题】:multiresources GET /search API implemented with JSONAPI使用 JSONAPI 实现的多资源 GET /search API
【发布时间】:2015-12-10 09:20:17
【问题描述】:

您将如何实现一个可以使用 JSONAPI 返回不同资源的 /search API?

GET /search?q=london 例如可以为“Jack London”返回一个 author 资源,为“London: The Novel”返回一个 book 资源

我通过实现 search 资源开始执行此操作,该资源将返回包含的 bookauthor 资源,但要遵循 JSONAPI,我必须将 API 重构为 GET /search?filger[q]=london

我感觉 JSONAPI 并没有真正解决这个(相当常见的)用例。

我的最终目标是通过使用 JSONAPI::Resources 的 Rails 后端和带有 ember-data 的 ember 应用程序来实现这一点

你有什么建议?

【问题讨论】:

  • 我认为您无法按原样使用 ember-data。您可能需要创建一个自定义适配器以根据服务器的结果返回适当的模型类型。
  • 一个包含许多书籍、拥有许多作者等的包装模型?

标签: ruby-on-rails search ember.js ember-data json-api


【解决方案1】:

您可以使用jsonapi-utils gem 手动执行此操作,以便您可以指向要用于序列化的资源:

使用jsonapi_serialize 方法:

class SearchesController < BaseController
  def index
    results = MySearchEngine.search(params)
    render json: jsonapi_serialize(results, options: { resource: UserResource })
  end
end

或者高级jsonapi_render方法:

class SearchesController < BaseController
  def index
    results = MySearchEngine.search(params)
    jsonapi_render json: results, options: { resource: UserResource }
  end
end

希望对你有帮助。

【讨论】:

    【解决方案2】:

    这就是我所做的:

    # config/routes.rb
    resource :search, only: [:show]
    
    # app/controllers/searches_controller.rb
    def show
      render json: Search.new(params).as_json
    end
    
    # app/classes/search.rb
    class Search
      def initialize(params = {})
        @results = [
          Author.where(name: params[:q]),
          Book.where(title: params[:q]),
        ].flatten
      end
    
      def as_json
        serialized_resources =
          @results.map do |result|
            resource = JSONAPI::Resource.resource_for(result.model_name.singular)
            serializer = JSONAPI::ResourceSerializer.new(resource)
            serializer.serialize_to_hash(resource.new(result, nil))[:data]
          end
        { data: serialized_resources }
      end
    end
    

    当然,有更好的方法吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 2020-06-06
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多