# models/option.rb
class Option < ApplicationRecord
# 값: 이름, 존재여부: 반드시 존재해야함
validates :name, presence: true
validates :option_price, presence: true
# 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
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에도 적용되는 것