TodoList: todo に description を追加 ― 2007年01月08日 07時33分40秒
% 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 を編集する必要はない。
最近のコメント