위처럼 하나의 Post가 여러개의 Memo를 가지는 One-to-Many Association을 만들어보려고 API를 비롯한 여러 문서들을 뒤져보았으나 레일즈 버전 차이때문인지 계속 실패하는 문제가 발생..
계속 헤매다 결국 작동하는 방법을 찾아냈고 그 과정을 아래에 정리해 보았다.
참고: 레일즈 버전 5.2.3 에서 진행 되었음
가장 먼저 Post 모델을 생성
rails g model Post title:string content:text
그 다음 Many side에 해당하는 Memo 모델을 생성한다.
rails g model Memo post:references title:string content:text
여기 post:reference 부분에서 Post의 id값을 참조하는 외래키 설정을 Memo 모델에 자동으로 해주게 된다.
변경사항 적용을 위해 마이그레이션을 진행한다.
rake db:migrate
마이그레이션이 끝나면 추가적으로 프로젝트의 config/models 디렉토리 내에 존재하는 post.rb와 memo.rb 파일을 수정해주어야 한다.
config/models/post.rb
has_many :memos, :dependent => :destroy
위와 같은 코드를 해당 파일의 클래스내에 넣어 준다. 이때 memo가 아닌 memos 임을 주의하자. (복수형)
delete on cascade 옵션을 추가해주기 위해 :dependent => :destroy 를 명시해주었다. (선택사항)
config/models/memo.rb
belongs_to :post
마찬가지로 위의 코드를 해당 파일의 클래스에 넣어 준다.
이제 다음 명령어를 통해 1번 id를 가진 post를 참조하는 memo를 생성할 수 있다.
@memo = Post.find(1).memos.create(:title => 'memoTitle', :content => 'memoContent')
또는 해당 post를 참조하는 모든 memo를 불러오거나 삭제하고 싶은 경우 다음과 같이 쓸 수 있다.
@post = Post.find(1) # id값이 1인 Post를 불러옴
@post.memos # @post가 가진 모든 메모를 컬렉션 형태로 리턴한다.
@post.memos.size # @post가 가진 모든 메모의 개수를 리턴
@post.memos.clear # @post가 가진 모든 메모를 삭제
이외에 더 자세한 사항들은 아래 API 링크를 참고하자!
https://rubykr.github.io/railsguides/associationbasics.html#has_many-association-reference
References