ruby on rails - Rails active_model_serializer con paginación
ruby-on-rails serialization (1)
Estoy usando active_model_serializer. Ahora quiero serializar un objeto con paginación, ¿debo hacer la lógica de paginación en el controlador o en el serializador?
Si elijo hacer la paginación en el serializador, debo pasar el número de página y la página por página al serializador. ¿Cómo debo hacer eso? Mi entendimiento es que el serializador solo toma el objeto modelo.
Solución de un solo uso
Los serializadores regulares solo se ocupan de elementos individuales, no de listas paginadas. La forma más directa de agregar paginación es en el controlador:
customers = Customer.page(params[:page])
respond_with customers, meta: {
current_page: customers.current_page,
next_page: customers.next_page,
prev_page: customers.prev_page,
total_pages: customers.total_pages,
total_count: customers.total_count
}
Solución reutilizable
Sin embargo, esto es bastante tedioso si necesita lógica de paginación para varios objetos. Al revisar la documentación de active_model_serializers, encontrará un ArraySerializer
para serializar una matriz de objetos. Lo que hice fue crear pagination_serializer.rb
usando ArraySerializer
para agregar automáticamente la etiqueta meta para matrices paginadas:
# my_app/app/serializers/pagination_serializer.rb
class PaginationSerializer < ActiveModel::Serializer::ArraySerializer
def initialize(object, options={})
meta_key = options[:meta_key] || :meta
options[meta_key] ||= {}
options[meta_key][:pagination] = {
current_page: object.current_page,
next_page: object.next_page,
prev_page: object.prev_page,
total_pages: object.total_pages,
total_count: object.total_count
}
super(object, options)
end
end
Una vez que haya agregado PaginationSerializer
a su aplicación de rieles, simplemente necesita llamarlo cuando necesite etiquetas meta de paginación de su controlador:
customers = Customer.page(params[:page])
respond_with customers, serializer: PaginationSerializer
Nota: escribí esto para usar a Kaminari como el paginador. Sin embargo, se puede modificar fácilmente para que funcione con cualquier gema de paginación o solución personalizada.