2014-12-02 50 views
6

我已經在Rails 3.2.19中使用了AMS(0.8),但是我真正與他們鬥爭的地方之一是如何控制序列化程序是否包含它們的關聯。我明顯使用AMS來構建JSON Api's。有時一個序列化器是葉子或者最遠的元素,有時它是最高層次,需要包含關聯。我的問題是做這件事的最好方法是什麼,或者是我在下面做的解決方案(或者是最好的解決方案)。如何有條件地包含Rails活動模型串行器中的關聯v0.8

我已經看到了一些討論,但我覺得他們很混亂(和基於版本)。很明顯,對於Serializer屬性或關聯,有一個include_XXX?方法,你可以在這裏返回一個真實或虛假的陳述。

這是我提出的代碼 - 它是一個釀酒師,有很多wine_items。這是你如何做到這一點?

模型類:

class WineItem < ActiveRecord::Base 
    attr_accessible :name, :winemaker_id 
    belongs_to :winemaker 

end 

class Winemaker < ActiveRecord::Base 
    attr_accessible :name 
    has_many :wine_items 
    attr_accessor :show_items 
end 

串行器:

class WinemakerSerializer < ActiveModel::Serializer 
    attributes :id, :name 
    has_many :wine_items 

    def include_wine_items? 
    object.show_items 
    end 
end 

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

,並在我的控制器:

class ApiWinemakersController < ApplicationController 
    def index 
    @winemakers=Winemaker.all 
    @winemakers.each { |wm| wm.show_items=true } 
    render json: @winemakers, each_serializer: WinemakerSerializer, root: "data" 
    end 
end 
+0

AMS 0.10.2:不起作用。 'def include_wine_items?'不起作用 - 不管它是否返回true或false,都包含關聯。 – prograils 2017-02-15 07:25:47

回答

1

我就遇到了這個問題我自己,這是最乾淨的解決方案至今(但我不是它的粉絲)。

這種方法可以讓你做這樣的事情:

/parents/1?include_children=true

,或者使用更清晰的語法,如:

/parents/1?include=[children],等...

# app/controllers/application_controller.rb 
class ApplicationController 
    # Override scope for ActiveModel-Serializer (method defined below) 
    # See: https://github.com/rails-api/active_model_serializers/tree/0-8-stable#customizing-scope 
    serialization_scope(:serializer_scope) 

    private 

    # Whatever is in this method is accessible in the serializer classes. 
    # Pass in params for conditional includes. 
    def serializer_scope 
    OpenStruct.new(params: params, current_user: current_user) 
    end 
end 

# app/serializers/parent_serializer.rb 
class ParentSerializer < ActiveModel::Serializer 
    has_many :children 

    def include_children? 
    params[:include_children] == true 
    # or if using other syntax: 
    # params[:includes].include?("children") 
    end 
end 

均田的hackish給我,但它的工作原理。希望你覺得它有用!

+0

AMS 0.10.2:不起作用。 def include_children?不起作用 - 不管它是否返回真或假,關聯都包含在內。 – prograils 2017-02-15 07:33:05