ActiveRecord::Migration?
데이터베이스의 구조인 스키마(Schema)를 기술하는 전통적인 방법은 SQL문을 사용해서 이루어지는데 레일즈 어플리케이션 프로그래머 입장에서 새로운 SQL 문법을 익히는 것은 부담스러운 문제였다. ActiveRecord::Migration은 루비 DSL을 이용해서 테이블을 정의하고, 칼럼을 변경하고, 인덱스를 추가하는 등의 데이터베이스 스키마 관리를 할 수 있는 기능을 제공한다. 이 글에서는 기본 기능에 대한 설명은 생략하고 유용한 팁 위주로 정보를 정리한다. ActiveRecord::Migration 전반에 대한 세부적인 내용은 공식 레일즈 가이드를 참조한다.
모델없이 테이블만 생성하기
rails generate migration create_blogs title:string

create_table :blogs do |t|
  t.string :title
end
기존 칼럼을 인덱스에 추가하기
blogs 테이블의 title 칼럼을 인덱스에 추가하는 방법은 다음과 같다.
add_index :blogs, :title
새로운 칼럼을 만들면서 인덱스에 추가하기
rails generate migration add_subtitle_to_blogs subtitle:string:index

add_column :blogs, :subtitle, :string
add_index :blogs, :subtitle
references 타입 칼럼 사용하기
rails generate migration add_user_blogs user:references

add_reference :blogs, :user, index: true
add_foreign_key :blogs, :users
user:refereces 지정으로 인해 blogs 테이블에 user_id 칼럼이 생성될 뿐 아니라 자동으로 index에 등록되고, FK(Foreign Key)로 할당된다.
칼럼 속성 바꾸기
rails generate migration add_user_blogs user:references

change_column :blogs, :summary, :text
FK(Foreign Key) 추가, 삭제하기

add_foreign_key :blogs, :users
add_foreign_key :blogs, column: :author_id
remove_foreign_key :blogs, :users
removeforeign_key :blogs, column: :author_id
위 내용은 데이터베이스 레벨에서의 Foreign Key Constraints를 지정하는 것이다. 레일즈는 모델 레벨에서 belongs_tohas_many의 :dependent 옵션 그리고 validates :foreign_key, uniquness: true 등을 통해 소위 Referential Integrity를 확보할 수 있기 때문에 데이터베이스에서의 FK를 반드시 필요로 하지는 않는다. 하지만 모델에서 필요한 선언을 제대로 하지 못하는 경우를 대비해서 데이터베이스에서 지정할 수 있게 준비되어 있다.
명령어 리스트
  • add_column
  • add_index
  • add_reference
  • add_timestamps
  • add_foreign_key
  • create_table
  • create_join_table
  • drop_table (must supply a block)
  • drop_join_table (must supply a block)
  • remove_timestamps
  • rename_column
  • rename_index
  • remove_reference
  • rename_table
마이그레이션 태스크
rake db:migrate
펜딩된 마이그레이션 파일을 실행하고 db:schema:dump 태스크를 수행해어 db/schema.rb를 갱신한다.
rake db:migrate VERSION=20080906120000
순방향 마이그레이션일 경우는 지정된 버전을 포함하고, 역방향 일때는 지정된 버전은 포함하지 않는다.
bin/rake db:rollback
마지막 실행한 마이그레이션을 롤백한다.
bin/rake db:rollback STEP=3
가장 최근의 마이그레이션 3개를 롤백한다.
bin/rake db:setup
데이터베이스를 생성하고 Schema 파일을 로드하며 Seed 데이터를 가지고 초기화까지 진행한다.
bin/rake db:reset
db:drop과 db:setup를 수행한다.
기존 레코드를 업데이트 하기

Category.reset_column_information
Category.all.each do |c|
  c.update_attribute :products_count, c.products.length
end