【问题标题】:How do I serialize habtm relationships in Ruby on Rails with fast_jsonapi如何使用 fast_jsonapi 在 Ruby on Rails 中序列化 habtm 关系
【发布时间】:2019-04-16 16:35:55
【问题描述】:

我创建了一个 Ruby on Rails API 应用程序,我想用fast_jsonapi 实现一个 JSON api。现在我正在与未显示的关系作斗争。我需要改变什么?

这是我的 schema.db:

create_table "candidates", force: :cascade do |t|
  t.string "place"
  t.string "zip_code"
  t.string "address"
  t.string "date_of_birth"
  t.string "title"
  t.string "profile_picture"
  t.string "first_name"
  t.string "last_name"
  t.string "email_address"
  t.boolean "confirm_terms_and_conditions"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

create_table "candidates_degrees", id: false, force: :cascade do |t|
  t.bigint "candidate_id"
  t.bigint "degree_id"
  t.index ["candidate_id"], name: "index_candidates_degrees_on_candidate_id"
  t.index ["degree_id"], name: "index_candidates_degrees_on_degree_id"
end

create_table "degrees", force: :cascade do |t|
  t.string "degree"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

这些是我的模型:

class Candidate < ApplicationRecord
  has_and_belongs_to_many :degrees, dependent: :nullify
end

class Degree < ApplicationRecord
  has_and_belongs_to_many :candidates, dependent: :nullify
end

这些是我的序列化程序:

class CandidateSerializer
  include FastJsonapi::ObjectSerializer
  attributes :place, :zip_code, ...
  has_many :degrees
end

class DegreeSerializer
  include FastJsonapi::ObjectSerializer
  attributes :degree
  has_many :candidates
end

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-5 fastjsonapi


    【解决方案1】:

    你可以这样做:

    class CandidateSerializer
      include FastJsonapi::ObjectSerializer
      attributes :place, :zip_code,...
      has_many :degrees, if: Proc.new { |record| record.association(:dregrees).loaded? }
    end
    
    class DegreeSerializer
      include FastJsonapi::ObjectSerializer
      has_many :candidates, if: Proc.new { |record| record.association(:candidates).loaded? }
    end
    

    在您的 API 操作中(此处例如显示路由):

    def show
      @candidate.degrees.load
      render json: CandidateSerializer.new(@candidate, options).serialized_json if stale?(@candidate)
    end
    
    private
    
    def set_candidate
      @candidate = Candidate.find_by(id: params[:id])
    end
    
    def options
      { include: [:degrees] }
    end
    

    结果

    {
        "data": {
            "id": "20",
            "type": "candidate",
            "attributes": {
                "id": 20,
                ...
            },
            "relationships": {
                "degrees": {
                    "data": [
                        {
                            "id": "713",
                            "type": "degree"
                        }
                    ]
                }
            }
        },
        "included": [
            {
                "id": "713",
                "type": "degree",
                "attributes": {
                    "id": 713,
                    ...
                },
                "relationships": {}
            }
        ]
    }
    

    【讨论】:

      【解决方案2】:

      您需要更改您的 CandidateSerializerDegreeSerializer

      您可以直接在attributes 中直接使用,而不是在序列化程序中编写单独的HABTM 关系

      例如

      class CandidateSerializer
        include FastJsonapi::ObjectSerializer
        attributes :place, :zip_code,:degrees
      end
      

      回复

      {
        :data=>
          {:id=>"",
           :type=>:candidate,
           :attributes=> {   
             degrees: {}
           }
       }
      

      DegreeSerializer 也一样

        class DegreeSerializer
          include FastJsonapi::ObjectSerializer
          attributes :candidates
        end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-01
        • 2011-07-05
        • 2023-03-29
        相关资源
        最近更新 更多