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 を編集する必要はない。

前回次回