직렬 변환기용 직렬 변환기

지난 몇 주 동안 저는 Ruby on Rails를 배웠고 특히 직렬 변환기의 강력한 단순성에 깊은 인상을 받았습니다. 예를 들어 실험실 그룹의 실험 및 화학 물질 재고를 추적하기 위한 앱을 구축합니다. 사용자는 로그인하여 실험을 생성하고 실험에 화학 물질을 부착하거나 제거할 수 있습니다. 케미컬도 DB에 생성하고, 수량을 편집하고, 제거할 수 있습니다. 예를 들어 "베이킹 소다와 식초 화산"이라는 설명으로 실험을 만들 수 있습니다. 이를 위해 기존 화학 물질, 베이킹 소다 및 식초를 추가할 수 있습니다. 이러한 화학 물질은 한 번에 여러 실험의 일부가 될 수 있으므로 모델은 다음과 같이 조인 테이블과 연결됩니다.

#/experiment.rb
class Experiment < ApplicationRecord
    has_many :chemical_experiments, dependent: :destroy
    has_many :chemicals, through: :chemical_experiments
    belongs_to :user

#/chemical.rb
class Chemical < ApplicationRecord
    has_many :chemical_experiments, dependent: :destroy
    has_many :experiments, through: :chemical_experiments

#/chemical_experiment.rb
class ChemicalExperiment < ApplicationRecord
  belongs_to :chemical
  belongs_to :experiment

#/user.rb
class User < ApplicationRecord
    has_many :experiments


로그아웃했다가 다시 로그인하면 하나의 요청으로 모든 사용자 데이터를 가져올 수 있기를 원합니다. 그러면 상태와 함께 React의 반응형 렌더링을 사용할 수 있습니다. 사용자, 실험 및 화학 물질에 대해 동일한 :belongs_to 및 :has_many를 설정하는 경우(모델이 올바르게 설정된 경우 조인 테이블 및 through:는 직렬 변환기에 필요하지 않음).

#/user_serializer.rb
class UserSerializer < ActiveModel::Serializer
  attributes :id, :username
  has_many :experiments

#/experiment_serializer.rb
class ExperimentSerializer < ActiveModel::Serializer
  attributes :id, :description, :is_complete
  has_many :chemicals

#/chemical_serializer.rb
class ChemicalSerializer < ActiveModel::Serializer
  attributes :id, :name, :amount_in_grams, :location


따라서 user#show 메서드(GET/user/:id)는 id, 사용자 이름 및 실험 배열이 포함된 사용자 개체를 반환해야 합니다. 각 실험 개체는 속성과 화학 개체의 배열을 반환해야 합니다.

#/users_controller.rb
    def show
        user = User.find(params[:id])
        render json: current_user, status: 200
    end


ID가 1인 사용자를 가져오면 다음과 같이 반환됩니다.

{
  "id": 1,
  "username": "Alex",
  "experiments": [
    {
      "id": 1,
      "description": "Baking soda and vinegar volcano",
      "is_complete": false
    }
  ]
}


문제는 기본적으로 ActiveModel Serializer가 한 계층 깊이만 반환한다는 것입니다. 다음 레이어인 실험과 관련된 화학 물질을 반환하려면 user_controller.rb에서 약간의 변경이 필요합니다.

#/users_controller.rb
    def show
        user = User.find(params[:id])
        render json: current_user, include: ['experiments', 'experiments.chemicals'], status: 200
    end


이 약간의 변경으로 데이터 트리를 구축하는 몇 개의 파일 사이에 몇 줄의 코드만 분할됩니다. 가져오기 요청이 이제 반환해야 하는 것은 직렬 변환기를 구축한 모든 중첩 데이터가 있는 사용자입니다.

{
  "id": 1,
  "username": "Alex",
  "experiments": [
    {
      "id": 1,
      "description": "Baking soda and vinegar volcano",
      "is_complete": false,
      "chemicals": [
          {
              "id": 1,
              "name": "Acetic Acid",
              "amount_in_grams": 500,
              "location": "Acids Cabinet, Lab B"
          },
          {
              "id": 2,
              "name": "Sodium Bicarbonate",
              "amount_in_grams": 1000,
              "location": "Chemical Storage, Shelf 2"
          }
      ]
    }
  ]
}


이 멋지게 구조화된 데이터는 특히 react와 같은 프레임워크에서 프런트 엔드를 훨씬 쉽게 구축할 수 있게 해줍니다. Ruby on Rails를 처음으로 탐구하는 다른 개발자들이 이 정보 중 일부를 유용하게 사용할 수 있기를 바랍니다.

좋은 웹페이지 즐겨찾기