active_model_serializer上的自定义助手

时间:2018-12-07 17:41:14

标签: ruby metaprogramming active-model-serializers

我想为序列化程序创建自定义帮助程序,就像标准attributes一样。

这样做的原因是因为在我的序列化程序中我有此方法

def version
  @version ||= PaperTrail.serializer.load(object.object)
end

我的大多数序列化程序属性都遵循以下模式:

attributes :has_foo

def has_foo
  version["has_foo"]
end

我没有在ActiveModelSerializer的文档说明中找到有关如何创建类似dsl的自定义方法的信息。假设我想称其为version_attributes

如果可以使用delegate来做到这一点,我很乐意(不知道该怎么办...)

我找到并正在使用的一项解决方法是我这样做了

class MySerializer < ActiveModel::Serializer
  def self.version_attributes(*attrs)
    attrs.each do |attr|
      define_method attr do
        self.send(:version)[attr.to_s]
      end
    end
  end

  attributes :has_foo, :has_bar
  version_attributes :has_foo, :has_bar

  def version
    @version ||= PaperTrail.serializer.load(object.object)
  end
end

但是我不喜欢必须两次声明has_foohas_bar ...

我看到了这个really old issue,但是到具有代码的要点的链接不再存在...

0 个答案:

没有答案