基于属性值的条件序列化

时间:2016-06-16 17:32:15

标签: ruby-on-rails ruby serialization active-model-serializers

我试图限制哪些子节点在序列化程序级别的json响应中显示。如果货币被标记为“有效”,则货币应包含在Merchant的有效负载中。如果货币为“非活动”,则不应包括商家的GET。

rails,4.2.5 active_model_serializers,〜> 0.10.0.rc3

串行器

class MerchantSerializer < ActiveModel::Serializer
  attributes :id, :merchant_name, :merchant_type, :currencies
  has_many :merchant_currency_maps
end

class MerchantCurrencyMapSerializer < ActiveModel::Serializer
  attributes :id, :currency, :b4flight_id, :aht_account_id, :created_at, :updated_at, :guess_merchant 
end

我尝试了什么

我尝试过制作include_currency_maps种方法link,但无济于事 并创建显示here的自定义属性。但我仍在努力掌握如何/应该如何做到这一点。

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您希望has_many :merchant_currency_maps仅包含有效的货币地图,对吗?您可以尝试覆盖MerchantSerializer

def merchant_currency_maps
  object.merchant_currency_maps.where(active: true)
end

答案 1 :(得分:0)

使用它可以让rails更好地缓存您的数据:

has_many :merchant_currency_maps, -> { where(active: true) }

或者这样做

has_many :active_merchant_currency_maps,   -> { where(active: true) }
has_many :merchant_currency_maps 
has_many :inactive_merchant_currency_maps, -> { where(active: false) }

每个都将单独缓存。令人担心的是,3个阵列中的每个阵列都有不同的对象,并且可能会变得不同步,除非您将轨道配置为同步它们。