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