我想使用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)不能用于分页。
答案 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