무민은귀여워

[Ruby on rails] 테이블 관리 1:1, 1:n, m:n 관계 본문

IT/기타

[Ruby on rails] 테이블 관리 1:1, 1:n, m:n 관계

moomini 2018. 11. 4. 23:06
반응형

[Ruby on rails] 테이블 관리 1:1, 1:n, m:n 관계

레일즈에서는 Association(관련)을 사용하여 여러 테이블에 걸쳐 데이터 조작을 손쉽게 할 수 있다.

레일즈에서 Association 기능을 사용하려면 다음과 같은 이름 규칙을 지켜야 한다.

・ 외부 키는 "<참조 모델 이름>_id"의 형식(ex: book_id, user_id)
・ 중간 테이블은 참조되는 테이블들을 "_" 기호로 연결. 이때 연결 순서는 사전 순서(ex: authors_books)

중간 테이블이란 m:n 관계를 나타낼 때 서로의 Association을 관리하기 위한 테이블로, 결합 테이블이라고도 한다.

belongs_to Association

가장 간단하고 자주 사용하는 것. 
books와 reviews 테이블을 예로 살펴보자. reviews 테이블이 book_id를 외부 키로 하여 books 테이블을 참조한다.

1
2
3
class Review < ApplicationRecord
  belongs_to :book
end
cs


1
<h2> [<%= @review.book.title %>] 의 리뷰 </h2>
cs


1:n 관계 has_many Association

belongs_to 메서드는 참조 소스 테이블 -> 참조 대상 테이블이라는 단방향 관계이지만, has_many 는 양방향을 정의할 수 있다.

1
2
3
class Book < ApplicationRecord
  has_many :reviews
end
cs


1
2
3
<% @book.reviews.each do |review| %>
<li><%= review.body %> (<%= review.updated_at %>)</li>
<% end %>
cs


1:1 관계 has_one Association

 일대일 대응 관계

1
2
3
class User < ApplicationRecord
  has_one :author
end

cs


1
2
3
class Author < ApplicationRecord
  belongs_to :user
end
cs


m:n 관계 has_and_belongs_to_many

중간 테이블을 이용해 다대다 관계를 표현.
books - authors_books[author_id(FK), book_id(FK)] - authors

1
2
3
class Book < ApplicationRecord
  has_and_belongs_to_many :authors
end

cs


1
2
3
class Authors < ApplicationRecord
  has_and_belongs_to_many :books
end
cs


m:n 관계 has_many through Association

has_and_belongs_to_many는 간단하지만 단점이 있다. 중간 테이블에서 양쪽 모델의 키라는 굉장히 단순한 정보만을 가지고 있는 것. 예를 들어 books와 users 테이블이 reviews 테이블을 사이에 두고 m:n 관계에 있는 구성은 m:n관계로 나타내지 못한다. 이러한 경우에는 reviews 테이블도 모델로 접근할 필요가 있다.

1
2
3
4
class Book < ApplicationRecord
  has_many :reviews
  has_many :users, through: :reviews
end
cs


1
2
3
4
class Review < ApplicationRecord
  belongs_to :book
  belongs_to :user
end
cs


1
2
3
4
class User < ApplicationRecord
  has_many :reviews
  has_many :books, through: :reviews
end
cs


반응형

'IT > 기타' 카테고리의 다른 글

0701 과제  (0) 2019.07.01
메모) php 코딩 규약  (0) 2018.11.26
[Ruby on rails] 테스트  (0) 2018.10.22
memo) yarn 관련 메모  (0) 2018.10.13
memo) Module build failed: TypeError: Cannot read property 'eslint' of undefined  (0) 2018.10.08
Comments