TodoList: todo に description を追加2007年01月08日 07時33分40秒

Todo が正しく表示し直される様になったところで、Description モデルを作成する。

% ruby script/generate model Description                                    
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/description.rb
      create  test/unit/description_test.rb
      create  test/fixtures/descriptions.yml
      exists  db/migrate
      create  db/migrate/004_create_descriptions.rb

次に todos テーブルと description テーブル間に一対多の関連を作る。


% cvs diff app/models
--- app/models/description.rb   4 Jan 2007 05:36:18 -0000       1.1
+++ app/models/description.rb   4 Jan 2007 05:37:29 -0000
@@ -1,2 +1,3 @@
 class Description < ActiveRecord::Base
+  belongs_to :todo
 end
--- app/models/todo.rb  27 Dec 2006 03:27:52 -0000      1.3
+++ app/models/todo.rb  4 Jan 2007 05:37:49 -0000
@@ -1,4 +1,6 @@
 class Todo < ActiveRecord::Base
+  has_many :descriptions, :dependent => :destroy
+
   has_many :todo_organization_permissions
   has_many :organizations, :through=>:todo_organization_permissions

has_many は以前に何回も使った。今回違うのは :dependent が付いているのである。descriptions の内容は、元となる Todo が消された時に、全て不要になる。:dependent => :destory と指定すると、Todo が消された時に、それに属する descriptions が全て消されるのだ。詳しくは has_many の API でも見て欲しい。

app/controllers/todo_controller.rb の destory 関数は以下のようになっている。


   def destroy
     Todo.find(params[:id]).destroy
     redirect_to :action => 'list'
   end

:dependent => :destory が無いと以下のように Todo.find(params[:id].descriptions.clear()Todo.find(params[:id]).destory の前に明示的に呼び出し、全ての desciption を消す必要がある。

   def destroy
     todo = Todo.find(params[:id])
     todo.descriptions.clear()
     todo.destroy
     redirect_to :action => 'list'
   end

これを、:dependent が肩代りしてくれるのだ。つまり、description を消すのに controller を編集する必要はない。

前回次回

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2007/01/08/1099988/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。