第5回: データベーステーブルとモデル

2010/05/01

前回は、タスク管理ツールのレイアウトを整えました。

今回は、タスクの中身を記録するデータベーステーブルとそれを取り扱うモデルクラスを作り、開発作業に必要な初期データを投入しましょう。

データベーステーブルとモデルの生成

Ruby on Rails の慣習に従い、タスクを記録するテーブルの名前を tasks、それに対応するモデルのクラス名を Task にします。

tasks テーブルは name, due_date, done という3つのカラムを持ちます。データ型はそれぞれ String, Date, Boolean とします。

ターミナルで、次のコマンドを実行します。

rails generate model task name:string due_date:date done:boolean
rake db:migrate

この結果、db ディレクトリの下に development.sqlite3 というファイルができているはずです。ここに空の tasks テーブルが格納されています。

シードデータの投入

アプリケーションの開発をする上で、データベースが空っぽではやりづらいので、初期データ(シードデータ)を投入します。

エディタで db/seeds.rb を開き、全部消してから、次のコードを記入してください。

table_names = %w(tasks)

table_names.each do |table_name|
  path = "#{Rails.root}/db/seeds/#{Rails.env}/#{table_name}.rb"
  require(path) if File.exist?(path)
end

Rails 2.3 までは、アプリケーションのルートディレクトリを参照するとき RAILS_ROOT という定数を使用しましたが、Rails 3.0 では Rails.root というクラスメソッドで参照します。また、現在の環境名についても、定数 RAILS_ENV ではなく Rails.env で参照します。

続いて、db ディレクトリの下に seeds/development ディレクトリを作成します。

その下に新しく tasks.rb ファイルを作成して、次のコードを記入します。

Task.create(:name => "Task 0", :due_date => Date.today, :done => true)

1.upto(9) do |n|
  Task.create(:name => "Task #{n}", :due_date => n.days.from_now, :done => false)
end

この Ruby プログラムは、「Task 0」から「Task 9」までの 10 個のタスクをデータベースに投入します。「Task 0」は今日が期限で、done カラムが true 値を持っています。その他のタスクは明日以降が期限で、done カラムの値は false です。

実際に、シードデータを投入するには、次のコマンドを実行します。

rake db:seed

シードデータを投入し直すには、次のコマンドを実行します。

rake db:reset

Rake タスク db:reset は、データベースを drop して全テーブルを作り直してからシードデータを投入しますので、ご注意ください。