使用 active_model_serializers 将方法应用于所有属性

Apply method to all attributes using active_model_serializers

使用rails-api/active_model_serializers,是否可以将一种方法应用于所有属性?

基本上,我想申请

object.zeroed_value(:symbol) 

每个属性,而不必为每个属性编写单独的方法。参见示例:

class NutritionalSerializer < ActiveModel::Serializer
  attributes :calories,
             :sodium

  def calories
    object.zeroed_value(:calories)
  end

  def sodium
    object.zeroed_value(:sodium)
  end

  # many, many more attributes...

end

我认为您可以使用元编程来生成您需要的所有方法,例如:

class NutritionalSerializer < ActiveModel::Serializer
  attributes :calories,
             :sodium

  %i{attr1 attr2 attr3}.each do |attr|
    define_method attr do
      object.zeroed_value(attr)
    end
  end
end

您也可以重写序列化器的 attributes 方法,然后执行如下操作:

class NutritionalSerializer < ActiveModel::Serializer
  def attributes
    data = super
    %i{attr1 attr2 attr3}.each do |attr|
      data[attr] = object.zeroed_value(attr)
    end
    data
  end
end