【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の定義は省略してます

이것이라면 다음과 같이 단점이 크다.
  • if 문의 계층 구조가 깊어진다
  • 책만 저장되고 author가 저장되지 않는 경우가 나온다

  • 조기 리턴이나 transaction으로 이것들을 회피할 수 있습니다만, 일부러 그런 번거로운 일을 하지 않아도 되는 방법이 있습니다 ✨(이하)

    books_controller
    # createアクション
    
    book = Book.new(book_params)
    author = book.build_author(author_params)
    return ['保存成功時の処理'] if book.save
    
    # 失敗時の処理
    

    이 경우 book 의 저장이 성공한 경우는 author 의 저장도 보증해 줍니다 (한쪽만 저장되지 않는다)

    당연히 외래 키는 연관되어 저장됩니다.
    깔끔하고 보기 쉽고, 팻 컨트롤러 대책도 됩니다 😍
    ※ 조기 리턴으로 리팩터도 있습니다

    모델의 관계성이, belongs_tohas_many 로 쓰는 방법이 바뀌므로 주의가 필요합니다

    belongs_to와 연관된 모델의 build


    book.build_author
    

    has_one에서의 연결도 여기가됩니다.

    has_many로 연결된 모델의 build


    author.books.build
    

  • 단 하나만 묶는 모델
    => build_[モデル名の単数形]
  • 복수 끈 모델
    => [モデル名の複数形].build

  • 라고 기억하면 좋을 것 같습니다 😇
    ( build_複数形 로 하면 인스턴스가 복수 build 되는 이미지가 붙기 때문에 이와 같이 나누었나요🤔)

    참고


  • belongs_to와 연관된 모델의 build
  • has_many와 연관된 모델의 build
  • 좋은 웹페이지 즐겨찾기