我如何序列化 Ruby 和 fast_jsonapi 上 Rails 中的 habtm 关系
How do I serialize habtm relationships in Ruby on Rails with fast_jsonapi
我在 Rails API 应用程序上创建了一个 Ruby,我想用 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
您需要对 CandidateSerializer
和 DegreeSerializer
进行更改。
无需在序列化程序中编写单独的 HABTM 关系,您可以直接在 attributes
例如
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
你可以这样做:
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": {}
}
]
}
我在 Rails API 应用程序上创建了一个 Ruby,我想用 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
您需要对 CandidateSerializer
和 DegreeSerializer
进行更改。
无需在序列化程序中编写单独的 HABTM 关系,您可以直接在 attributes
例如
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
你可以这样做:
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": {}
}
]
}