発言管理用のテーブル&モデルを作成

ユーザ管理テーブルではいきなり変則的なモデルの作り方をしてしまいましたが、次は「普通」に発言を管理するStatusテーブルを作ってみます。

まず、次のコマンドを打ち込んでmodelとmigrationのファイルを自動生成します。

% script/generate model status
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/status.rb
      create  test/unit/status_test.rb
      create  test/fixtures/statuses.yml
      exists  db/migrate
      create  db/migrate/002_create_statuses.rb

そして、生成された db/migrate/002_create_statuses.rb を編集し、Statusesテーブルに必要なカラムを書き加えます。

class CreateStatuses < ActiveRecord::Migration
  def self.up
    create_table :statuses do |t|
      t.column :user_id,  :integer                           #ここから追記
      t.column :status,    :text
      t.column :created_at,                :datetime
      t.column :updated_at,                :datetime         #ここまで
    end
  end

  def self.down
    drop_table :statuses
  end
end

user_idはユーザ管理テーブルとの関連用、statusが発言内容を格納するカラムです。user_id という名称には「Userクラスのidをキーとして関連する」という意味があります。また、created_at、updated_at というのはRailsでは特殊な意味があり、エントリの作成日時/更新日時を自動的に保存してくれるというものです。

以上を追記した後、

% rake db.migrate

を実行すると、statusesテーブルが生成されます。


次に、User - 1:n -> Status という関連を示すために、モデル部分に追記を行います。

app/models/status.rb に次のように belongs_to メソッドを追記し、userと関連することを示します。

class Status < ActiveRecord::Base
  belongs_to :user    # 追記
end

逆に、app/models/user.rb には次のように has_many メソッドを追記します。

class User < ActiveRecord::Base
  has_many :statuses, :dependent => :destroy     #追記
...

認証用に自動生成したので既にいろいろ入っていますが、適当な場所に書きます。

なお、belongs_to のあとは単数系、has_many のあとは複数形で書きます。英語的に読むと自然ですが、ちょっとややこしい…。また、 :dependent => :destroy と書いておくと、Userを削除した際に、関連するStatus(es)も削除してくれます(デフォルトでは残ってしまう)。


とりあえず、ここまでで各ユーザが発言した内容(複数)を管理するためのモデルが出来上がりました。


理解すべきことは非常にたくさんありますが、多分まだ10行ちょっとしか書いてません。
でも、まだ発言の追加・削除はもちろん、表示も出来ません*1。というわけで、次はコントローラ、ビューを作っていきます。

ここまでのソース

monologue_000.tar.bz2

*1:ActiveScaffold(もっといろいろ自動生成)を使っていれば、この辺りで一連の機能はできてしまっているのかも…。