SinatraからActiveRecord 3を使う(1) マイグレーション

以前SinatraからDataMapperを使う記事を書いたけど、今回はSinatraのO/Rマッパー部分にActiveRecord 3を使ってみる。ActiveRecord 3自体の使い方については、この記事がすごくわかりやすかった。

Sinatraアプリに必要なファイルを用意する

まずは、Sinatraアプリを実行するのに必要な最低限のファイル群(Gemfile, config.ru, app.rb)を作成する。今回は基本的にすべてBundler経由で操作するので、システム側にBundlerのgemがインストールされている必要がある。

Gemfile

今回使用するgemはこんな感じ。とりあえずSinatraでActiveRecord 3を使う場合はactiverecordsinatra-activerecordsqlite3が必要で、今回使ったバージョンはそれぞれ、3.0.6、0.1.3、1.3.1。

source :rubygems
gem 'sinatra'
gem 'slim'
gem 'activesupport', :require => 'active_support/all'
gem 'activerecord'
gem 'sinatra-activerecord', :require => 'sinatra/activerecord'
gem 'sqlite3'
gem 'rake'

$ bundle installする

$ bundle install --path vendor/bundle

vendor/bundleフォルダにgemがインストールされて、Gemfile.lockが生成される。

config.ru

次にconfig.ruを用意する。ここで全部requireするようにしておく。

require 'rubygems'
require 'bundler'
Bundler.require
require './app.rb'
run Sinatra::Application

app.rb

本体となるapp.rbを用意する。とりあえず、ほぼ空っぽ状態で。

get '/' do
  'hoge'
end

これで最低限のファイルが揃ったので、

$ bundle exec rackup config.ru

でラックアップするとSinatraアプリを起動できる。http://localhost:9292/にアクセスして「hoge」と表示されれば準備おk

rakeタスクを使ってテーブル作成(マイグレーション)

Rakefileを作成して、rakeを使ってテーブル作成(マイグレーション)する。

Rakefile

マイグレーション用ファイルを生成するためのRakefileを作成する。

require 'sinatra/activerecord'
require 'sinatra/activerecord/rake'

このパッケージをrequireするだけで、以下の2つのrakeタスクが追加される。

$ bundle exec rake -T
rake db:create_migration  # create an ActiveRecord migration in ./db/migrate
rake db:migrate           # migrate your database

db:create_migration

試しに、rake db:create_migrationをしてみると、

$ bundle exec rake db:create_migration
no NAME specified. use `rake db:create_migration NAME=create_users`

名前を指定して実行してね、って言われるので、その通りにする。今回はとりあえず、単にカウントするためだけのテーブルを作成するので、「create_」にcountを複数形にして「counts」を足した。このときはこのファイル名の命名は重要かと思ったけど、あとから振り返ってみると、それほど重要でもなかったっぽい。

$ bundle exec rake db:create_migration NAME=create_counts

これでプロジェクトディレクトリを覗いてみると、db/migrateフォルダが生成されて、その中にマイグレーション用ファイル20110416111646_create_counts.rbが作られている。開いてみるとこんな感じ。まだ空っぽ。

class CreateCounts < ActiveRecord::Migration
  def self.up
  end
  def self.down
  end
end

これをベースに、次のようにself.upメソッド内に必要なカラムを書き足していく。

class CreateCounts < ActiveRecord::Migration
  def self.up
    create_table :counts do |t|  #=> この引数名「:counts」がテーブル名になる
      t.string :user
      t.integer :count, :default => 0
      t.timestamps  #=> この一行でcreated_atとupdated_atのカラムが定義される
    end
  end
  def self.down
    drop_table :counts
  end
end

db:migrate

マイグレーション用ファイルができたら、$ rake db:migrateを実行してマイグレーション(テーブル作成)する。

$ bundle exec rake db:migrate

うまくいくと、プロジェクトディレクトリにdevelopment.dbのSQLite3ファイルが生成されて、Litaなどビューアーで中身を覗くと、ちゃんと先ほどcreate_migrationファイルで指定したカラムが準備されている。

ここまででDBファイルとテーブルの準備が完了したので、次回はそれを使って実際にデータを保存したり読み込んだりするCRUDについて。


「ActiveRecord」の基本とデータの参照 - @IT 第2回 Active Recordの使い方 | Think IT