Rails - activerecord 模型序列化器按外部特定列分组结果 table

Rails - activerecord model serializer group results by specific column in the foreign table

我想使用 ActiveRecord 模型序列化程序来显示来自主键 table 和外键 table 的结果。但是,我希望结果按外键 table.

中的列分组显示
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

现在 cat_name 不是唯一的,人们可以共享许多 cat_name。请注意,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) 不适用于分页。

您可以使用接受已按 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