Fast-Json Lane에서의 생활: JSON:API 직렬 변환기 사용

3750 단어 apirubyjson
지난 주에는 양식 처리 및 상태 업데이트, 가져오기 요청을 통해 백엔드로 데이터 보내기에 대한 트릭과 팁을 다루었습니다. 그 이후로 다양한 모델 간의 관계를 구축하고 Netflix에서 만든 Json 직렬 변환기Fast_JSONAPI Serializer(지금은 JSONAPI Serializer)를 통해 데이터를 보내는 작업을 포함하여 백엔드에서 데이터를 가져오는 작업을 끝없이 해왔습니다. 저는 시리얼라이저로 작업하면서 몇 가지 새로운 것을 배웠고 이번 주에 제 지혜를 전할 수 있다고 느꼈습니다.

내 응용 프로그램의 데이터베이스는 모두 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 이후 요청에서 데이터를 수집하는 데 도움이 될 것이라고 말하는 직렬 변환기에서 관련 링크를 정의하는 방법을 배우려고 시도하고 있습니다. 나는 그것을 시도하고 그것이 얼마나 잘 나오는지 볼 것입니다. 다음 시간까지!

좋은 웹페이지 즐겨찾기