【Rails】 어소시에이션으로 끈 레코드를 자동 보존
개요
중급자는 알고 당연해서 초보자용입니다 🔰
어소시에이션에 관련지을 수 있었던 모델을 보존할 때, 한쪽의 레코드에 외래 키가 설정되어 있기 때문에, 「저장 처리를 2회로 나누어야 한다」라고 생각한 적은 없습니까? (저장할 때까지 id가 확정되지 않기 때문에)
그럴 때 어떻게 해야 하는 이야기입니다.
※ 자신도 과거 좋지 않은 코드를 쓰고 있었으므로, 같은 초보자의 참고가 되어 주시면 다행입니다
구체적인 예
예를 들어 책 모델(Book)과 저자 모델(Author)이 있다고 가정합니다.
(
book has_many authors
관계)Book 모델📕
컬럼
금형
보충
id
integer
title
문자열
작성자 모델
컬럼
금형
보충
id
integer
book_id
integer
외래 키
이름
문자열
이 때 초보자가하기 쉽다는 것을 아래에 쓰는 방법
books_controller
# createアクション
book = Book.new(book_params)
if book.save
author = Author.new(book_id: book.id, name: author_params[:name])
if author.save
# 保存後の処理
else
# 失敗時の処理
end
else
# 失敗時の処理
end
# book_params, author_paramsの定義は省略してます
이것이라면 다음과 같이 단점이 크다.
조기 리턴이나 transaction으로 이것들을 회피할 수 있습니다만, 일부러 그런 번거로운 일을 하지 않아도 되는 방법이 있습니다 ✨(이하)
books_controller
# createアクション
book = Book.new(book_params)
author = book.build_author(author_params)
return ['保存成功時の処理'] if book.save
# 失敗時の処理
이 경우
book
의 저장이 성공한 경우는 author
의 저장도 보증해 줍니다 (한쪽만 저장되지 않는다)당연히 외래 키는 연관되어 저장됩니다.
깔끔하고 보기 쉽고, 팻 컨트롤러 대책도 됩니다 😍
※ 조기 리턴으로 리팩터도 있습니다
모델의 관계성이,
belongs_to
와 has_many
로 쓰는 방법이 바뀌므로 주의가 필요합니다belongs_to와 연관된 모델의 build
book.build_author
has_one에서의 연결도 여기가됩니다.
has_many로 연결된 모델의 build
author.books.build
=>
build_[モデル名の単数形]
=>
[モデル名の複数形].build
라고 기억하면 좋을 것 같습니다 😇
(
build_複数形
로 하면 인스턴스가 복수 build 되는 이미지가 붙기 때문에 이와 같이 나누었나요🤔)참고
Reference
이 문제에 관하여(【Rails】 어소시에이션으로 끈 레코드를 자동 보존), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/koki_73/items/abcdf252d40911ffad9e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)