[Ruby On Rails] Relation 개념 이해하기(has_many, belongs_to, dependent)

sunaaa·2021년 4월 16일
2

Ruby On Rails

목록 보기
18/20

📚 샘플 코드1

t.references :item, null: false, foreign_key: true
# 원래는 함수임. t.references(:item, {null: false, foreign_key: true})
class Option < ApplicationRecord
  belongs_to: item # 옵션은 아이템에 속해있다
end
class Item < ApplicationRecord
  has_many: options, # 역으로, 아이템은 많은 옵션을 가지고 있다
            dependent:  :destroy 
# 의존성 설정(dependent) : 아이템(부모레코드)이 삭제 되면 
# 옵션(자식레코드)은 destroy(null값을 주는 게 아니라, 아예 같이 삭제 시키겠다)
end

📚 샘플 코드2

class Order < ApplicationRecord
  belongs_to: user, # 주문은 사용자에 속해있다
              optional: true # 사용자가 반드시 필요한 값은 아님(=is nullable)
end
class User < ApplicationRecord
  has_many: orders, # 유저는 주문을 가지고 있다
            dependent:  :nullify
# 유저(부모레코드)가 삭제 되면 
# destroy : 주문(자식레코드)은 같이 삭제하지 않고 null값을 준다
end

✨ 내가 이해한 방법

  • 부모레코드 파일에서 자식레코드와 자식의 의존성을 설정해줘야 한다
    => 부모는 내가 어떤 자식을 가지고 있는지 알려주고, 자식을 어떻게 통제할 것인지 적어줘야 한다
# 이해를 돕기 위한 예시 코드
class Mentor < ApplicationRecord
  belongs_to: wecode
# 자식 레코드에서 본인의 부모 레코드를 명시해줘야 함(소속 밝힘)
# 멘토는 위코드에 속해있다
end

class Wecode < ApplicationRecord
  has_many: mentors, dependent: destroy
# 위코드(부모레코드)에는 많은 멘토들을 가지고 있다.
# 위코드가 없어지면 멘토만 남을 수 없고 멘토도 같이 해고된다.
# 우리가 없어지면 멘토들도 같이 나가야 한다고 위코드가 정해버리는 것.
  has_many: wecoders, dependent: :nullify
# 위코드(부모레코드)는 많은 위코더들을 가지고 있다.
# nullify: 위코드가 없어져도, 위코더는 없어지지 않는다. 이 내용을 위코드에서 명시해준다.
end


class Wecoder < ApplicationRecord
  belongs_to: wecode, optional: true
# belongs_to : 위코더는 위코드에 속해있다(소속 밝힘)
# optional : 하지만 위코드가 반드시 필요한 것은 아니다.
  

end

👀 여기서 다시 보는 의존성(Dependency) 개념

HOW 부모의 레코드가 삭제 됐을 때 자식 레코드는? (루비온레일즈 용어)

  • Destroy : 같이 삭제를 시켜버리는 것
  • Nullify : 유저의 외래키(FK)만 빈값으로 바꾸는 것

💾 값 설정은 어디서? DB, Model 모두

샘플 명령어 : DB 삭제

Item.first.destroy item의 첫번째 데이터 삭제
Item.all 잘 삭제됐나 확인

  • 위에서 설정해준 dependent 속성에 따라 삭제 방식이 달라짐
  • 즉, relation 설정을 레일즈 쪽에서 해줘야, ORM을 쓸 때 문제가 안생김
  • 루비온레일즈에서 데이터 설정은 마이그레이션 파일에서 끝나는 것이 아니라, 모델 파일의 설정도 굉장히 중요함
profile
Be Playful Front-end Developer

2개의 댓글

comment-user-thumbnail
2021년 4월 16일

와우 적절한 비유로 이해가 바로 됐네요 !!

1개의 답글