第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 して全テーブルを作り直してからシードデータを投入しますので、ご注意ください。