ruby-on-railsrubyruby-on-rails-5fastjsonapi

How do I serialize habtm relationships in Ruby on Rails with fast_jsonapi


I created a Ruby on Rails API application where I wanted to implement a JSON api with fast_jsonapi. Now I'm struggling with the relationships, which aren't shown. What do I have to change?

This is my 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

And these are my models:

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

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

These are my serializers:

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

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

Solution

  • you need to do changes in your CandidateSerializer and DegreeSerializer.

    Instead of writing the separate HABTM relation in serializer you can directly right in attributes

    e.g

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

    response

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

    same for DegreeSerializer

      class DegreeSerializer
        include FastJsonapi::ObjectSerializer
        attributes :candidates
      end