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

时间:2015-09-30 22:33:23

标签: ruby-on-rails active-model-serializers rails-api serializer

使用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
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:3)

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

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