Association 정리
- Model간 관계를 사전에 정의하여 두 개 이상의 모델에서 동시에 데이터를 갖고 올 때, method 사용을 통해서 빠르게 갖고 올 수 있음 (Association을 사용하는 이유)
- Association도 결국 ActiveRecord에서 사전에 정의된 Method들이며, 알맞게 Model < ActiveRecord 파일 내에서 association을 정의한 뒤, 해당 Model에서 메쏘드처럼 사용하는 것이다.
- 기본적으로 모델 간 관계를 맺는 방식은 테이블의 foreign_key와 상대편 테이블의 primary_key다.
- primary_key는 말그대로 참조 대상 테이블의 id 이고, foreign_key는 별도의 언급이 없을 시에 참조 소스 테이블 내, (참조대상테이블 모델이름)_id 로 설정되있다.
- 참조 소스 테이블내 foreign_key 가 되는 column은 has_one, has_many, belongs_to, has and belongs to many 네 가지 모든 케이스에 대해 변경이 가능하다.
- 반면, 참조 대상 테이블 내 primary는 belongs to, has_many의 경우에 가능함
- association method의 리턴 값은 배열임
- 양 모델간의 관계면 어떤 모델 안에 Association을 써줘야 하나? → 내가 기준으로 잡을, 즉 먼저 불러낼 Model 안에다가 써준다. 여기서 Association을 정의한 뒤, 해당 Model 뒤에 method로 Association을 사용하면 된다.
순서 관계가 헷갈릴 수 있으니 아래와 같이 양 모델 간의 기준을 명확히 하자. 아래처럼 하면 안헷갈린다. (아래 참조)
- 참조 대상 테이블은 Association 에서 primary key를 가지고 이는 테이블
- 참조 소스 테이블은 Association 에서 foreign key를 가지고 있는 테이블
belongs to: class A belongs to B → A는 참조 소스 테이블, B는 참조 대상 테이블
class Review(참조 소스 테이블) < ApplicationRecord
belongs_to :book(참조 대상 테이블), foreign_key :oooo_id (Review(참조 소스 테이블)에서 외래키로 가지려는 col 값, and 이 외래키는 참조 대상 테이블 book의 primary_key 와 mapping 됨 )
has_many: A has_many B → A는 참조 대상 테이블, B는 참조 소스 테이블 → A가 1개, 이에 매핑되는 B가 many
has_one: A has_one B → A는 참조 대상 테이블, B는 참조 소스 테이블 → A가 1개, A에 매핑되는 B도 1개
has_many through: A has_many B through C, 그리고 B has_many A through C 임 → A와 B는 참조 대상 테이블(primary key를 갖음), C는 참조 소스 테이블이며, A, B의 primary key 와 매핑되는 foreign key를 동시에 갖는다. 그래서 C를 through
→ 구현 방법, 위에서의 A,B,C를 Book (A), User(B), Review(C)라 하자
Book(A) Model class 내 association
- Book(A) has_many Review(C)
- Book(A) has_many User(B) through Review(C)
Review(C) Model class 내 association(Review는 참조 대상 테이블인 A,B 사이에 속하기만 한다.)
- Review(C) belongs_to Book(A)
- Review(C) belongs_to User(B)
User(B) Model Class 내 Association
- User(B) has_many Review(C)
- User(B) has_many Book(A) through Review(C)
has_many through 모델을 사용하면 좋은 점이 원래 같으면, Book에서 User를 '한 번'의 Association method 사용으로는 찾을 수 없는데, has_many through로 method를 정의하면 Book에서 User를 한번에 찾을 수 있다.(물론 User에서 book을 찾는 inverse도 성립)
추가로, Association 관계에 있는 모델들을 '한꺼번에', 즉, 우리가 갖고 오고자 하는 모델 내 모든 데이터 row들 및 이 모델에 Associated된 모델들의 row들을 한꺼번에 갖고 올 때, joins, includes 를 사용함
joins와 includes 의 차이점으론, joins는 inner join을 기본으로 하며, Associated 된 모델과 결합한 통짜 table을 갖고 오는 것이고, includes는 기준이 되는 (Method가 정의되 있는) 모델을 기준으로 left join이며, 배열 형태로 데이터를 리턴해줍니다.
'Back_End(Ruby on Rails)' 카테고리의 다른 글
Ruby 의 Garbage Collection 을 이해할 수 있는 GC 모듈 (Ruby GC Module, which helps to understand the Garbage Collection of Ruby) (0) | 2020.02.14 |
---|---|
Rails Application Request/Response Cycle(레일즈 애플리케이션은 서버에서 어떻게 작동할까?) (2) | 2020.02.10 |
Rails Transaction Isolation Level (트랜잭션 격리 레벨) (0) | 2020.02.10 |
Rails N+1 Query (N+1 쿼리 문제란?) (0) | 2020.02.10 |
Rails/디자인패턴(Design Pattern)/Decorator/Draper Gem을 이용 (0) | 2019.11.23 |