Пользовательский помощник на active_model_serializer - PullRequest
0 голосов
/ 07 декабря 2018

Я хотел бы создать специальный помощник для сериализатора, очень похожий на стандартный 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_foo и has_bar дважды ...

Iвидел эту действительно старую проблему , но ссылка на гист, в которой был код, больше не существует ...

...