2017-05-31 78 views
0

我还没有在Stackoverflow上找到同样的问题。除了医疗辅助队变得如此迅速,甚至2岁的答案经常会过时。ActiveModel :: Serializers JSON API嵌套关联包括?

我使用Rails 5仅API和gem'active_model_serializers'(AMS)(版本0.10.6)。

我也使用JSONAPI响应格式 - 不仅仅是JSON。

我需要渲染一个嵌套包括 - 不仅仅是嵌套关系。

代码例如:

serializer1:

class QuestionSerializer < ActiveModel::Serializer 
    attributes :id, :title, :created_at, :updated_at 
    belongs_to :user 
end 

serializer2:

class UserSerializer < ActiveModel::Serializer 
    attributes :id, :email 
    has_many :cities 
end 

serializer3:

class CitySerializer < ActiveModel::Serializer 
    attributes :id, :name 
end 

控制器:

def index 
    @questions = Question.all 
    render json: @questions, include: [:user, 'user.city'] 
end 

我得到这样的回应:

{ 
    "data": [ 
    { 
     "id": "1", 
     "type": "questions", 
     "attributes": { 
     "title": "First", 
     "created-at": "2017-03-27T13:22:15.548Z", 
     "updated-at": "2017-03-27T13:22:16.463Z" 
     }, 
     "relationships": { 
     "user": { 
      "data": { 
      "id": "3", 
      "type": "users" 
      } 
     } 
     } 
    } 
    ], 
    "included": [ 
    { 
     "id": "3", 
     "type": "users", 
     "attributes": { 
     "email": "[email protected]" 
     }, 
     "relationships": { 
     "cities": { 
      "data": [ 
      { 
       "id": "75", 
       "type": "cities" 
      } 
      ] 
     } 
     } 
    } 
    ] 
} 

我真的得到一个嵌套关系city。我甚至得到城市id

但问题是 - 我怎样才能获得其他city属性,如name?我需要另一个include部分 - 也许在当前include部分(嵌套?)内。

如何做到这一点? (没有任何额外的宝石)

回答

0

下应该这样做

render json: @questions, include: [:categories, user: :city] 
+0

不,事实并非如此。结果是一样的。 – prograils

+0

您必须设置城市模型 –

+0

某处的属性,除非您允许某些特定属性,否则通常您将获得所有属性 –

0

我找到了一些解决方案。我不知道它有多清洁。它是基于2个先决条件:

  1. https://github.com/rails-api/active_model_serializers/blob/db6083af2fb9932f9e8591e1d964f1787aacdb37/docs/general/adapters.md#included

  2. ActiveModel Serializers: has_many with condition at run-time?

我申请了有条件的关系和user - 全宽松include

控制器:

@questions = Question.all 

render json: @questions, 

show_user: (param? params[:user]), 

show_cities: (param? params[:city]), 

include: [:user, "user.**"] 

serializer1:

class QuestionSerializer < ActiveModel::Serializer 
    attributes :id, :title, :created_at, :updated_at 
    belongs_to :user, if: -> { should_render_user } 

    def should_render_user 
    @instance_options[:show_user] 
    end 
end 

serializer2:

class UserSerializer < ActiveModel::Serializer 
    attributes :id, :email 
    has_many :cities, if: -> { should_render_cities } 

    def should_render_cities 
    @instance_options[:show_cities] 
    end  
end 

serializer3:

class CitySerializer < ActiveModel::Serializer 
    attributes :id, :name 
end 

帮手:

def param? param 

    param && param != "false" && param != "nil" 

end 

有条件的关系允许控制哪个include实际呈现。

0

你还应该包括对参数的用户“域”,并使用字符串,而不是对参数符号包括

render json: @questions, fields: [:title, :user], include: ['user', 'user.cities']