2

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

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

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

我觉得这个(很常见的)用例并没有真正被 JSONAPI 解决。

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

你有什么建议?

4

2 回答 2

0

这是我所做的:

# 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

当然,有更好的方法吗?

于 2016-05-25T19:26:05.903 回答
0

您可以使用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

希望能帮助到你。

于 2015-12-29T00:31:31.807 回答