[Ruby On Rails] ORM3

sunaaa·2021년 4월 16일
0

Ruby On Rails

목록 보기
12/20
post-custom-banner

DB Create

  • Item.create 할 때 컬럼이 뭐가 들어있는지 확인하려면? schema.rb가서 확인!
  • create하면 COMMIT 메세지를 꼭 받아야 함! 아니면 롤백된거임!
  • 롤백된 경우...create뒤에 !를 붙여서 오류메세지 볼 수 있고 디버깅 가능함
  • 보통 반드시 존재해야 하는 값(validates)이 안들어 간 경우라 오류남
  • 모델 파일 바꿨으면 리로드(reload!) 꼭 할 것

반드시 존재해야 하는 값 넣는 방법(=not null)

  • 보통은 레일즈에서 설정함
  • 설정하는 방법은 도큐 참고할 것
  1. 레일즈의 어플리케이션 쪽에서 설정하는 방법
# models/option.rb
class Option < ApplicationRecord
  # 값: 이름, 존재여부: 반드시 존재해야함
  validates :name, presence: true
  validates :option_price, presence: true
  1. 데이터베이스에서 설정하는 방법
# db/migrate/20210416055504_create_items.rb
class CreateOptions < ActiveRecord::Migration[6.0]
  def change
    create_table: options do |t|
    # null: false 라고 마이그레이션 파일에서 지정해줌
      t.references :name, null:false
      t.references :item, null: false, foreign_key: true
      t.integer: quantity

M:N 관계 설정하는 법

class Like < ApplicationRecord
  belongs_to :user
  belongs_to :item
end
# Like는 user와 item에 소속됨
class Item < ApplicationRecord
  has_many :options, dependent: :destroy
  has_many :likes, dependent: :destroy
  has_many :liked_users, through: :likes, source: :user
end
# Item은 옵션들(자식레코드)을 가짐. 아이템이 지워지면 옵션도 같이 지워짐
# Item은 Likes를 가짐. 아이템이 지워지면 Likes도 지워짐
# Item은 Liked_users를 가짐. 자식 Likes를 통해서 user 데이터 가져옴(likes가 맵핑테이블로 연결해줌)
class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable, :trackable
  mount_uploader :image, ImageUploader
  
  has_many :orders, dependent: :nullify
  has_many :likes, dependent: :destroy
  has_many :liked_items, through: :likes, source: :item
end
# User는 Orders를 가짐. User가 삭제돼도 Order는 남기는 값임
# User는 Likes를 가짐. User가 지워지면 같이 없어지는 값임.
# User는 Liked_items를 가짐. 자식 Likes를 통해서 item데이터를 가져옴.(likes가 맵핑으로 연결해줌)

여기서 드는 질문... => 해결

model과 db는 별개다
리액트에서는 뷰만 관리했고, 특히 상태관리를 하며 데이터 흐름이 다 연결되어있었기 때문에 헷갈림...
model의 역할은 뭐지?
model에서 특정 아이템을 좋아한 사람들(liked_users), 특정 유저가 좋아한 아이템들(liked_items)
이런 건 db에 테이블로 들어가는 게 아닌데, only 관계 설정?
이게 나중에 model을 가지고 api를 만드는건가? 이 단계에서 model에다 적어주는 이유가 뭐지...?
=> 게시글-댓글 관계에 있어 사람은 당연히 이 둘이 연관관계가 있다는 것을 '상식'으로 알고있다. 하지만 컴퓨터는 그런 상식 조차도 생각하지 않다 보니 따로 명시를 해둬야 할 필요가 있는 것이다. 관계를 알려주는 것이다.

Model에서 추상적으로 잡아준 다음에 마이그레이션 해주면 DB에도 적용되는 것

profile
Be Playful Front-end Developer
post-custom-banner

0개의 댓글