Fast-Json Lane에서의 생활: JSON:API 직렬 변환기 사용
내 응용 프로그램의 데이터베이스는 모두 included_to 및 has_many 관계를 통해 연결된 여러 테이블/모델로 구성됩니다. 직원에게는 프로필과 이전 근무 경험이 있고 고용주에게는 채용 공고가 있으며 모두 지원을 통해 연결됩니다. 이전 프로젝트에서는 필요한 데이터를 얻기 위해 너무 많은 가져오기 요청을 했습니다. 예를 들어 고용주에 대한 요청과 관련 지원자에 대한 요청이 있었습니다. 고용주가 채용 공고나 지원자가 많으면 데이터를 로드하는 데 시간이 오래 걸릴 수 있다는 사실을 서서히 깨달았습니다.
나는 과거에 읽을 수 있는 json 형식으로 데이터를 정의하는 데 도움이 되는 직렬 변환기를 구축한 경험이 있습니다. 여기에는 가져오기 요청을 최소화하기 위해 관련 데이터를 반복하는 작업이 포함되었습니다. 리듀서는 결과를 수신하고 중첩 데이터를 반복하여 상태를 올바르게 업데이트합니다.
class RecordSerializer
include FastJsonapi::ObjectSerializer
attributes :id, :date, :daily_allowance, :daily_total, :user_id
has_many :days
attribute :days do |record|
days = Day.where(record_id: record.id)
recs = {}
days.each do |day|
recs[:id] = day.id
recs[:item_name] = day.item_name
recs[:item_calories] = day.item_calories
end
end
end
과거에는 잘 작동했지만 결과에 중첩되지 않고 데이터를 전달하는 더 효율적인 방법이 있어야 한다는 것을 알고 있었습니다. JSONAPI 에 대한 지침을 읽으면서 반복자를 정의할 필요가 없다는 것을 알았습니다. owns_to 및 has_many 속성이 있는 모델과 유사한 직렬 변환기를 설정하여 직원을 처음 가져올 때 프로필과 작업 기록을 간단히 포함할 수 있습니다.
class EmployeeSerializer
include JSONAPI::ObjectSerializer
attributes :id, :email, :name
has_one :profile
has_many :work_histories, through: :profile
has_many :applicants
has_many :jobs, through: :applicants
end
render json: EmployeeSerializer.new(@employees, include: [:profile, :work_histories])
작업에 연결된 대규모 데이터 집합을 가져오기 시작할 때까지 상황이 조금 더 명확해지기 시작했습니다. 고용주가 로그인할 때 고용주와 관련된 작업 데이터도 전달될 것이라고 생각했습니다. 그런 다음 프로필 정보와 이전 직장 경험도 포함된 잠재적 후보자(지원자 조인 테이블을 통해 연결됨)를 포함하도록 확장했습니다. 내 감속기는 점점 커지고 너무 많은 코드로 채워져 작업을 가져오기 위한 긴 로그를 시각적으로 볼 수 있었습니다.
JSONAPI의 읽어보기 부분으로 돌아가 관련 레코드를 전달하는 대체 방법이 있다는 것을 알게 되었습니다.
class JobSerializer
include JSONAPI::ObjectSerializer
belongs_to :employer
has_many :applicants
has_many :employees, through: :applicants
has_many :profiles, through: :employees
attributes :id, :employer_id, :status, :title, :city, :state, :jobtype, :schedule,
:skills, :certificates, :description, :employees, :profiles
end
직원과 해당 프로필 모두 이미 작업과 관련되어 있으므로 JobSerializer의 속성으로 삽입할 수 있습니다. 이것은 ProfileSerializer에 정의된 프로필과 함께 EmployeeSerializer에 이미 정의된 모든 관련 직원 정보를 전달합니다. 단일 가져오기 요청으로 나중에 직원을 가져오는 대신 고용주의 채용 공고 및 잠재적 후보자 정보를 표시하는 데 필요한 모든 데이터를 갖게 되었습니다. 원래는 object_method_name을 통해 매개변수를 정의했지만 주어진 이름과 다른 이름을 매개변수에 할당하려는 경우에만 필요하다는 것을 깨달았습니다.
내 애플리케이션을 위한 기능을 구축하는 대신 내 코드를 리팩토링하는 데 너무 많은 시간을 할애했을 수도 있지만 내 코드는 훨씬 깨끗하고 부팅하기에 매우 적합합니다. 실제 테스트는 데이터베이스에 많은 양의 레코드가 있고 이 단일 가져오기 요청에서 모든 레코드를 로드하는 데 걸리는 시간입니다. 나는 또한 JSONAPI 이후 요청에서 데이터를 수집하는 데 도움이 될 것이라고 말하는 직렬 변환기에서 관련 링크를 정의하는 방법을 배우려고 시도하고 있습니다. 나는 그것을 시도하고 그것이 얼마나 잘 나오는지 볼 것입니다. 다음 시간까지!
Reference
이 문제에 관하여(Fast-Json Lane에서의 생활: JSON:API 직렬 변환기 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/indiejesus2/life-in-the-fast-json-lane-working-with-json-api-serializer-4dnj텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)