バリケンのRuby日記 RSSフィード

2007-04-21

[][] 「嫌なこと書き貯めWebアプリ」を作ろう(4)  「嫌なこと書き貯めWebアプリ」を作ろう(4) - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  「嫌なこと書き貯めWebアプリ」を作ろう(4) - バリケンのRuby日記  「嫌なこと書き貯めWebアプリ」を作ろう(4) - バリケンのRuby日記 のブックマークコメント

昨日のエントリの続きだよ。

Entryテーブルの値の設定

ようやくきょうはカーディナリティ(「1対多」とかの数量の関連性)の設定だよ。でもそのまえに、昨日は設定していなかった「利用者(User)」が「たいへんカード(Card)」を「書き込んだ(Entry)」という記録の部分にも、値を設定するよ。

Entryテーブルの属性は「いつ書き込んだか(created_on)」「誰が書いたか(user_id)」「どのカードに書いたか(card_id)」となっているよ。そして面白いことに、「いつ書き込んだか(created_on)」については、値を新規に作成したときにRails自動的にタイムスタンプを値として入れてくれるよ。

じゃあ、値を設定してみよう!

Entry.create( :user_id => 1, :card_id => 1 )
Entry.create( :user_id => 1, :card_id => 2 )
Entry.create( :user_id => 4, :card_id => 3 )
Entry.create( :user_id => 2, :card_id => 4 )

デバッグコンソールで値を見てみると、日付が自動的に入っているのがわかるよ。

C:\rails\magica>ruby script\console
Loading development environment.
>> require 'pp'
=> ["PP"]
>> pp Entry.find(:all)
[#<Entry:0x48ef270
  @attributes=
   {"created_on"=>"2007-04-21 06:07:21",
    "card_id"=>"1",
    "id"=>"1",
    "user_id"=>"1"}>,
 #<Entry:0x48ef248
  @attributes=
   {"created_on"=>"2007-04-21 06:07:39",
    "card_id"=>"2",
    "id"=>"2",
    "user_id"=>"1"}>,
 #<Entry:0x48ef220
  @attributes=
   {"created_on"=>"2007-04-21 06:07:39",
    "card_id"=>"3",
    "id"=>"3",
    "user_id"=>"4"}>,
 #<Entry:0x48ef1f8
  @attributes=
   {"created_on"=>"2007-04-21 06:07:40",
    "card_id"=>"4",
    "id"=>"4",
    "user_id"=>"2"}>]
=> nil
>>

カーディナリティの設定

じゃあ、いよいよカーディナリティの設定をしてみるよ。いままで設定した値から考えると、

という関連性があるから、これを設定するよ。まずはC:\rails\magica\app\models\card.rbをエディタ編集するよ。エディタで開くと

class Card < ActiveRecord::Base
end

という内容になっているから、

class Card < ActiveRecord::Base
  has_one :entry
  belongs_to :card_detail
end

と設定するよ。次にC:\rails\magica\app\models\card_detail.rbだよ。

class CardDetail < ActiveRecord::Base
  has_many :cards
end

その次はC:\rails\magica\app\models\entry.rbだよ。

class Entry < ActiveRecord::Base
  belongs_to :user
  belongs_to :card
end

さいごにC:\rails\magica\app\models\user.rbだよ。

class User < ActiveRecord::Base
  has_many :entries
  has_many :cards, :through => :entries
end

こう設定しておくことで、各テーブル間で関連する値を簡単に参照できるようになるよ。

たとえば、「2番のカードは、誰が書いたものかな?」ということを調べるには

Card.find(2).entry.user.name.tosjis

とすればいいし、「ユーザーIDが1番の人の悩み事を一覧で表示したい!」ということであれば

User.find(1).cards.each{|i| puts i.content.tosjis }; nil

とすればいいよ。デバッグコンソールで試してみてね。

C:\rails\magica>ruby script\console
Loading development environment.
>> $KCODE='s'
=> "s"
>> require 'kconv'
=> []
>> Card.find(2).entry.user.name.tosjis
=> "バリオ"
>> User.find(1).cards.each{|i| puts i.content.tosjis }; nil
バリトとのけんか
バリミがつついてくる
=> nil
>>

ほかにもいろいろなデータの参照方法があるから、いろいろ試してみてね。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20070421