【问题标题】:Rails - activerecord model serializer group results by specific column in the foreign tableRails - 外部表中特定列的activerecord模型序列化程序组结果
【发布时间】:2019-05-24 00:14:46
【问题描述】:

我想使用 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 不是唯一的,Person 可以共享许多 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) 不适用于分页。

【问题讨论】:

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


    【解决方案1】:

    您可以使用自定义序列化程序来接受已经分组的 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
    

    【讨论】:

    • 谢谢,我收到 ""500 error": "Internal Server Error"" : ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR: missing FROM-clause entry for table "person" LINE 1: ...cats"."person_id" GROUP BY ...
    猜你喜欢
    • 2011-04-30
    • 2023-03-17
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 2010-09-17
    • 2010-11-21
    • 1970-01-01
    相关资源
    最近更新 更多