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