[INSOMENIA] TIL 02

송나은·2021년 4월 14일
3

[INSOMENIA]

목록 보기
4/18
post-custom-banner

2강 M:N Relation 그리고 Migration, ORM

Migration

->Migration.doc
Migrate를 하기 전에는 db에 등록된 파일이 아니다.
rails에서 migrate는 타임스탬프 기준으로 이후의 파일을 migrate한다.

이미 migrate된 파일을 변경하는 방법

  1. 외부저장소에 변경한 파일을 올리지 않았을 경우 / 갖고 있는 데이터가 많지 않을 경우 / 이후에 생성한 파일에 중요한 데이터가 없을 경우
    rails db:rollback 가장 최신의 migrate 파일을 삭제한다.
  2. 외부저장소에 이미 올라간 파일이거나 중요한 데이터를 가지고 있어서 수정할 수 없을 경우
    rails g migration change_columns_from_options 추가적인 migration 파일을 만들어서 수정한다.
  • remove_column :options, :stock // options라는 테이블에서 stock을 지우겠다.
  • rename_column :options, :price, :options_price // options라는 테이블에서 price를 options_price로 바꾸겠다.
  • add_column :items, :price, :integer items라는 테이블에서 price를 추가하겠다

Migrate 파일은 삭제하지 말 것!

M:N Relation (has many)

특정 사용자가 좋아한 아이템들, 특정 아이템을 좋아한 사용자들
Like라는 중간 테이블 활용

rails g model Like user:references item:references 아이템과user를 참조하는 중간테이블 Like생성

특정 아이템이 삭제되었을 때, 사용자가 삭제되었을 때 좋아요가 삭제되어야 하는 destroy 관계. -> null: false

ORM

객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다. 객체 모델과 관계형 모델 간에 불일치가 존재한다.
-> ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다. -> Reference

rails 어플리케이션 서버, 비즈니스 로직 관리 / postresql db관리
rails와 postresql을 통역해주는 장치가 ORM이다. (=Object Relational mapping)

예시 )

option테이블을 생성할 때 rails g model option item:references 을 작성했다.

  1. 'Option이 item에 속해있다.' 라는 의미로 option.rb 파일에belongs_to :item 이라고 쓰여있다.
    2. Item은 options와 has_many 관계에 있고, item이 삭제되면 options도 삭제되는 destroy 관계를 갖는다.

rails.c

rails DB에 등록된 정보들을 가져올 수 있다.

  • Item.create 상품 등록하기
  • Item.find(id), Item.find(name), Item.where()조건을 만족하는 모든상품 찾기

배열 같지만 배열이 아닌 Record가 생성된다.

  • rails에서 Validation 설정하기-> name이 존재해야 한다고 validates를 설정했기 때문에, create할 때 name을 입력하지 않으면 오류가 발생한다.
  • Item 삭제하기

ORM 완성!?!?

  • likes한 item, likes한 user에 대한 정보를 가져오고 싶을 때: has_many에 through와 source를 추가한다.

references 컬럼에 null허용 하는법

  1. migrate 파일에서 null: falsenull: true로 변경한다.
    null: false인데 item_id가 null이면 에러가 발생한다.
  2. 모델에 optional: ture를 추가한다.
    belongs_to :item이라고 기술하면 item_id는 presence: true가 디폴트이다.

💡 루비문법 datatype :Symbol

(루비 irb 시작 exit 끝)
String은 STACK영역에 저장하여 값을 지정할 때마다 메모리 주소를 새롭게 갖게 되는데, Symbol은 메모리를 HEAP 영역에 저장하여 계속해서 재사용한다.

+) 런치트레인 탑승

점심 때 출발하는 런치트레인 너무 귀엽다. 그냥 귀여워서 기록ㅎ기. 귀여운개발자들

profile
그때그때 공부한 내용과 생각을 기록하는 블로그입니다.
post-custom-banner

0개의 댓글