반응형

카페 홈페이지를 만들면서 겪은 경험 중 하나는 데이터 테이블의 구조를 변경해야 하는 일이 있어서 몇자 적어보기로 했다.
제품 등록 부분이였는데, 이부분은 요구사항을 듣고, 그닥 어렵지 않게 구현되었다.
입력하고, 보여주고 업데이트 하고 지우는 정도인 간단하게 명령어 하나로 끝내버렸다.

그러나.. ㅡ,.ㅡa

일요일날 카페 친구와 이야기를 나누던 중, 제품(products) 관련 부분이 상당히 중요한 부분에서 잘못 이해되고 만들어 졌다는걸 알게 되었다.

초기에 받았던 요구 사항 중

1. 고객은 6개월, 12개월 단위로 한꺼번에 주문을 할 수 있어야 한다. (가격은 관리자가 직접 입력한다.)
    (이해) 각각의 커피를 6개월치, 12개월 치를 한꺼번에 주문한다.
2. 고객은 "이달의 커피" 를 커피 리스트 상단에서 볼 수 있어야 한다.
   (이해) 이달의 커피로 선정된 커피가 따로 상단에 올라간다.
3. 고객은 "샘플러" 혹은 프로모션 으로 관리되는 커피를 구입 할 수 있어야 한다.
   (이해) 따로 이벤트 커피세일로 관리하여 제품리스트와는 별도로 관리한다.

 이야기를 나누던 중, 위의 요구사항 부분이 틀렸다는걸 알았다.

1. 고객은 6개월 제품을 구입하면, 6개월 간 MD 추천의 다른 커피를 매달 받을 수 있어야 한다.
2. 고객은 커피 리스트 상단에 보이는 (MD 추천된) "이달의 커피" 로 받을 커피를 확인 할 수 있다.
3. 샘플러 커피나 프로모션 커피는 이벤트 커피 세일이 아닌 하나의 제품으로 팔려야 한다.

음.. 이런 이런 일이 생기다니.. 커헐..
서로 함께 이야기 하면서 같은 부분을 이정도로 다르게 이해 전달을 잘못 받을 수 있다는거에 충격을 먹었다.
(내 경험이 그닥 많지 않으므로.. ㅋㅋ) 여하튼, 그럼 수정에 들어가야 한다.

그럼 틀리게 만들어진 products 테이블을 보기로 하자. (200903230948203948_create_products.rb)

위의 테이블을 보면, 정말 성의 없이 만들어 진걸 알 수 있다. ㅡ,.ㅡ (챙피해..)
뭐 여하튼 챙피 하지만 잘못된 테이블이니 잘 만들어야 겠다.
(200903230948203948_create_products.rb) 파일 내 붉은 글씨 부분들은 이제 필요없는 부분들이다.
그리고 파란색 부분은 새로 추가 되어야 할 컬럼들이다.

products 테이블 외에도 필요한 새로운 테이블이 2개 생겼다.

1. productorigin: 나라와 농장, 그리고 제품 아이디를 가지고 있는 테이블
2. price : 제품 아이디 당 각각의 무게에 대한 가격을 들고 있는 테이블

그리고 공통 코드 테이블내에 product_type 이 추가 되게 되었다. : Normail, Sampler, CoffeeMonthly

자.. 그럼 서로의 관계는..

1. product has many product origins
2. product origins has one product
3. proudct has many price
4. price has one product
5. product origin has many nationals farms
6. nationals, farms has many product origins


자 그럼.. alter table을 해보기로 하자.

$/ruby script/generate migration change_product

위의 명령어를 쳐서 db/migrate/2009023948029_change_product.rb 파일을 만든 뒤

class ChangeProduct < ActiveRecord::Migration
  def self.up
 remove_column :products, :national_id, :farm_id, :level, :image_url, :p200,:p500, :p1000,:p6m200,:p6m1000, :p12m200, :p12m500, :p12m1000
 add_column :products, :name, :string
 add_column :products, :product_type, :string

  end

  def self.down
 remove_column :products, :name, :product_type
  end
end

up 과 down 쪽에 파란색 부분을 넣어준다. 솔직히 원상복귀를 위해서는 self.up 내에 있는 remove_column 에 있는 모든 컬럼을 self.down 내에 add_column 으로 만들어 줘야 한다. 하지만 이전으로 복귀하지 않을 생각에 새로이 추가된 컬럼 2개만 없애버리기로 했다.

자 이제 rake db:migrate 을 하게되면

==  ChangeProduct: migrating ==================================================
-- remove_column(:products, :national_id, :farm_id, :level, :image_url, :p200, :p500, :p1000, :p6m200, :p6m1000, :p12m200, :p12m500, :p12m1000)
   -> 2.9486s
-- add_column(:products, :name, :string)
   -> 0.2711s
-- add_column(:products, :product_type, :string)
   -> 0.2248s
==  ChangeProduct: migrated (3.4452s) =========================================

두둥~ 테이블이 변경되었다.
자 이제 모델 productorigin 과 price 2개를 만들어 필요한 데이터들을 저장 할 수 있도록 바꾸는 작업만 남았다.
 


 

반응형

+ Recent posts