직렬 변환기용 직렬 변환기
#/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를 처음으로 탐구하는 다른 개발자들이 이 정보 중 일부를 유용하게 사용할 수 있기를 바랍니다.
Reference
이 문제에 관하여(직렬 변환기용 직렬 변환기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/alexmcdgit/serializers-for-your-serializers-29h9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)