ここでの私の主な質問は、1つの動的フォーム内で1対多の関係を管理する場合のプラママップの処理と、動的フォームを介してドメインオブジェクトを編集/更新する場合の1対多の処理のベストプラクティスです。私の質問への入力は次のとおりです。
以下に示すドメインオブジェクトを1つの動的フォームで作成できるフォームをハックすることができました。電話番号を作成して連絡先に割り当てるための別のフォームを用意しても意味がないため、私のアプリケーションでは、すべてを1つのフォームで作成します。以前の質問で尋ねたものと同様の何かを実装することができました(助けてくれた人々に感謝します)
class Contact{
String firstName
String lastName
// ....
// some other properties
// ...
static hasMany = [phones:Phone]
static mapping = {
phones sort:"index", cascade: "all-delete-orphan"
}
}
class Phone{
int index
String number
String type
Contact contact
static belongsTo = [contact:Contact]
}
基本的に、「params」マップから値を取得して自分で解析し、ドメインオブジェクトと関連付けを手動で作成することができました。つまり、デフォルトのスキャフォールディングで使用されているのと同じロジックを使用しませんでした。
Contact c = new Contact(params)
など....、私はすべてのパラメータをループし、ドメインオブジェクトを手作りして保存しましたが、すべてうまくいきました。
私のコントローラーには、次のようなコードブロックがあります(これは、ポイントを示すために削除されています)
//create the contact by handpicking params values
def cntct = new Contact()
cntct.firstName = params.firstName
cntct.lastName = params.lastName
//etc...
//get array of values for number,type
def numbers = params['phone.number']
def types = params['phone.type']
//loop through one of the arrays and create the phones
numbers.eachWithIndex(){ num, i ->
//create the phone domain object from
def phone = new Phone()
phone.number = num
phone.type = types[i]
phone.index = i
cntct.addToPhones(phone)
}
//save
私の質問は次のとおりです。
- このような状況に対処するためのベストプラクティスは、この場合はコマンドオブジェクトを使用すると機能します。はいの場合、これに関する詳細情報はどこにありますか。検索中に見つけたすべての例は、1対1の関係を扱っています。 1対多の例が見つかりませんでしたか?
- この場合、連絡先オブジェクトを編集するときに電話を追加/削除するという観点から、電話の関係に対処するための最良の方法は何ですか。保存時に常に新しい電話を作成する必要があるため、作成ロジックは単純ですが、連絡先の更新を処理するときに、ユーザーが電話を削除したり、既存の電話を編集したり、新しい電話を追加したりした可能性があります。今のところ、連絡先が持っているすべての電話を削除し、フォームに投稿された内容に従って再作成するだけですが、それは最善の方法ではないと思います。また、既存の電話をループすることもないと思います。投稿された値と比較して手動の差分を実行することもそれを行うための最良の方法ですが、これに対処するためのベストプラクティスはありますか?
ありがとう、うまくいけば質問は明確です。
[編集]詳細については、フォーム内のjavascript(jquery)を使用して電話情報を動的に追加および削除できます[/ edit]