Rails-ActiveRecord模型序列化器组结果按外部表中的特定列

时间:2019-05-24 00:14:46

标签: ruby-on-rails pagination active-model-serializers

我想使用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

现在cat_name不是唯一的,并且人可以共享许多cat_name。请注意,Person => has_many猫,但是cat_name可以类似于多个Person。如何以这种格式显示数据:

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

还请注意,groyp_by(&:cat_name)不能用于分页。

1 个答案:

答案 0 :(得分:1)

您可以使用自定义序列化程序,该序列化程序已经接受了groupby 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