본문 바로가기

Back_End(Ruby on Rails)

RubyOnRails/Model Association

반응형

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이며, 배열 형태로 데이터를 리턴해줍니다. 

반응형