2017-05-31 129 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']