[from now] 2014/04/25 00:34:44

diff --git a/controller/databinding.md b/controller/databinding.md
index e6ce68b..8584dcc 100644
--- a/controller/databinding.md
+++ b/controller/databinding.md
@@ -228,10 +228,10 @@ assert book.title == "My Book"
 assert book.author.name == "yamada"
 ```

-コンストラクタを使ってバインディングをする場合は、`Book`クラスの`author`は`new Author()`で変数を初期化しておく必要はありません。
-データをバインドするときに、自動的にインスタンスが生成されます。
+`Book`クラスの`author`は`new Author()`で変数を初期化しておく必要はありません。
+もし関連先のインスタンスが存在しない場合はデータをバインドするときに、自動的にインスタンスが生成されます。

-次のように`properties`や`bindData`を使って、既存のインスタンスに対してデータバインディングをする場合は、新規にインスタンスが生成されることはなく、既存のインスタンスの値が上書きされます。
+次のように`properties`や`bindData`を使ってバインディングをするときに、すでにその関連クラスのインスタンスが存在する場合は、新規にインスタンスが生成されることなく既存のインスタンスの値が上書きされます。

 ```
 def book = Book.get(1)
@@ -244,7 +244,7 @@ assert book.title == "New Book"
 assert book.author.name == "New Name"
 ```

-また、関連クラスがドメインクラスの場合は`id`パラメータを指定することで自動的にインスタンスを読み込んで設定することができます。
+また、これ以外にも関連クラスがドメインクラスの場合は`id`パラメータを指定することで自動的にインスタンスを読み込んで設定することができます。

 ```
 def dataSource = [title: "My Book", author: [id: "1"]]
@@ -252,14 +252,101 @@ def book = new Book(dataSource)
 assert book.author == Author.get(1)
 ```

+`id`指定による自動設定は、`Book`クラスの登録画面で登録済みの`Author`の一覧をセレクトボックスで指定可能にするような場面で有効です。
+この場合は`Author`を選択するセレクトボックスの名前を`author.id`にします。
+
+```
+<select name="author.id">
+    <option value="1">山田</option>
+    <option value="2">田中</option>
+</select>
+```
+
+このようにすることで`Book`クラスへデータをバインディングするときに、`author.id`で選択した値を元に自動的に`Author`が読み込まれます。
+また、このセレクトボックスを生成する便利なタグリブが用意されていますが、詳しくはGSPの説明の中で紹介します。
+
 ### コレクションのバインディング

+コレクションのバインディングも、リクエストパラメータによる値のバインディングと、`id`指定による自動読み込みができます。
+まずは値のバインディングから説明していきましょう。
+
+コレクションのバインディングはリクエストパラメータ名に少し工夫が必要です。
+単一クラスの場合は単にプロパティ名をリクエストパラメータ名にしますが、コレクションの場合はプロパティ名にインデックスを付与したパラメータ名にする必要があります。

-## アクションの引数
+次のようなドメインクラスを例に説明します。

+```
+class Author {
+    String name
+    static hasMany = [books: Book]
+}
+class Book {
+    String title
+}
+```

-## コマンドクラス
+この時、`Author`の`books`をバインディングするリクエストパラメータは`name=yamada&books[0].title=mybook1&books[1].title=mybook2`のようになります。
+これは`params`では次のようなマップの構造になります。
+
+```
+[
+    name: "yamada",
+    "books[0]": [
+        title: "title1"
+    ],
+    "books[1]": [
+        title: "title2"
+    ]
+]
+```
+
+これを次のようにバインディングできます。
+
+```
+def dataSource = [
+    name: "yamada",
+    "books[0]": [
+        title: "mybook1"
+    ],
+    "books[1]": [
+        title: "mybook2"
+    ]
+]
+def author = new Author(dataSource)
+assert author.name == "yamada"
+assert author.books.size() == 2
+assert author.books*.title as Set == ["mybook1", "mybook2"] as Set
+```
+
+単一クラスのバインディングと同じように、コレクションのインスタンスや関連クラスのインスタンスが存在しない場合は、自動的にインスタンスが生成されるため明示的に初期化する必要はありません。
+もし、すでにインスタンスが存在する場合は既存のインスタンスの値が上書きされます。
+
+ここで、リクエストパラメータのインデックスの指定に違和感を感じた方もいるでしょう。
+なぜなら`books`は`static hasMany = [books: Book]`と宣言しているだけなので、`books`のコレクションの型は`Set`になるからです。
+`Set`にインデックスは存在しないにもかかわらず、バインド元となるデータのキーにはインデックスを指定しています。
+
+このインデックスはコレクションが`Set`の場合は、バインド元のデータ内でインスタンスを区別するためのユニークなキーでしかありません。
+そのため次のような、インデックスに抜けがあるような場合も問題なく動作します (推奨しているわけではありません)。
+
+```
+def dataSource = [
+    name: "yamada",
+    "books[0]": [
+        title: "mybook1"
+    ],
+    "books[3]": [
+        title: "mybook2"
+    ]
+]
+def author = new Author(dataSource)
+assert author.name == "yamada"
+assert author.books.size() == 2
+assert author.books*.title as Set == ["mybook1", "mybook2"] as Set
+```

+上記のようにインデックスに抜けがあるような場合も、単に2つインスタンスとして認識されます。
+インデックスがバインド元となるデータ内でインスタンスを区別するためのユニークなキーだとすると、すでに存在する既存のデータを更新するにはどういたらよいでしょうか。
+このような場合は`id`を使って明示的に更新対象のインスタンスを指定する必要があります。

 ## バインディングのカスタマイズ