我的主要问题是在一个动态表单中管理一对多关系时处理 pramas 映射,以及在通过动态表单编辑/更新域对象时处理一对多的最佳实践。我的问题的输入如下。
我设法破解了一个表单,该表单允许我在一个动态表单中创建如下所示的域对象,因为没有必要使用单独的表单来创建电话号码,然后将它们分配给联系人,因此只需在我的应用程序中以一种形式创建所有内容。我设法实现了类似于我在上一个问题中提出的问题(感谢提供帮助的人)
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]
}
我基本上设法从“参数”映射中获取值并自己解析它们并手动创建域对象和关联。即我没有使用默认脚手架中使用的相同逻辑,即
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
我的问题如下:
- 处理这种情况的最佳实践是什么,在这种情况下使用 Command 对象是否有效,如果是,我在哪里可以找到更多关于此的信息,我在搜索过程中找到的所有示例都处理一对一关系,我找不到一对多的例子?
- 在这种情况下,就编辑联系人对象时添加/删除电话而言,处理电话关系的最佳方法是什么。我的意思是创建逻辑很简单,因为我必须始终在保存时创建新手机,但是在处理更新联系人时,用户可能已经移除了手机和/或编辑现有手机和/或添加了一些新手机。现在我所做的只是删除联系人拥有的所有电话并根据表单发布的内容重新创建它们,但我觉得这不是最好的方法,我也不认为循环现有的那些并与发布的值进行比较并进行手动差异也是最好的方法,是否有关于如何处理这个问题的最佳实践?
谢谢,希望问题很清楚。
[edit] 只是为了获取更多信息,可以在表单中使用 javascript (jquery) 动态添加和删除电话信息 [/edit]