Rails - результаты сериализатора модели activerecord по конкретному столбцу во внешней таблице - PullRequest
0 голосов
/ 24 мая 2019

Я хочу использовать сериализатор модели ActiveRecord для отображения результатов из таблицы первичного ключа и таблицы внешнего ключа.Однако я хочу, чтобы результаты были представлены сгруппированными по столбцу в таблице внешнего ключа.

cats = Cats.paginate(page: params[:page], per_page: 20)
render json: cats, meta: pagination(cats), adapter: :json

В сериализаторе модели ActiveRecord:

class CatSerializer < ActiveModel::Serializer
attributes :cat, :persons

 def persons
   object.person
 end

 def cat
   { id: object.id, cat_name: object.name}
 end

Теперь имя_каталога не является уникальным и персоныможет поделиться многими именами кошек.обратите внимание, что Person => has_many Cats, но cat_name может быть похож на несколько Persons.Как я могу показать данные в этом формате:

"results": [
{
  "cat": {
    "id": 11,
    "cat_name": "Luzi",
    ...
  },
  "persons": [
    {
      "id": 1,
      "name": "andy"
    },
    {
      "id": 2,
      "name": "david"
    }

Обратите внимание, что groyp_by (&: cat_name) не работает с нумерацией страниц.

1 Ответ

1 голос
/ 24 мая 2019

Вы можете использовать пользовательский сериализатор, который принимает уже сгруппированный результат ActiveRecord

def index
  @cats = Cat.joins(:persons).group("persons.name")
  render json: @cats, serializer: GroupedCatSerializer
end

И вы можете определить пользовательский сериализатор как

class GroupedCatSerializer < ActiveModel::Serializer

  # method override
  def serializable_object(options={})
    @object.map do |group_key, models|
      [ group_key , serialized_models(models) ]
    end.to_h
  end

  private

  def serialized_models models
    models.map{ |model| CatSerializer.new(model, root: 
    false) }
  end

end
...