Grails有很多批量创建

时间:2013-06-17 18:43:10

标签: grails

我正在尝试为hasMany实现“批量”插入。并且在那里得到了90%,但是我的多层设计打了个嗝。我有一个类似

的模型
class Parent {
    static hasMany = [references: Reference]
}

class Reference { 
    static belongsTo = [parent: Parent]
    String name
}

class ConcreteReference extends Reference{
    String childName
}

我能够通过标记来获得创建working(通过创建记录定义)

<form action='reference/1/edit>
 <input name='references[0].name' value='name1' />
 <input name='references[0].childName' value='childName1' />

 <input name='references[1].name' value='name2' />
 <input name='references[1].childName' value='childName2' />
</form>

但问题是它总是创建具体类型(class ='domain.Reference'),因此“子名称始终为null。

我用过:

def edit(def id){
    def parent = Parent.get(id)
    //i actually clear all the old references first (didn't show that code)
    parent.properties = params
    parent.save(flush:true)
}

我如何指定“具体类型”(我尝试了类的隐藏值,它不起作用)或者是否有一种简单的方法来循环访问params.reference [idx]创建它然后将它添加到Parent ?

希望很清楚,如果您需要任何澄清,请告诉我。

1 个答案:

答案 0 :(得分:0)

我解析params的手动方法(不是我硬编码ConcreteReferences,但我能够对params进行分组):

def refRegex = /^([a-zA-Z]+\[\d+\])/
for (ref in params.groupBy { it -> it.key.find(refRegex)}.findAll{it.key}){
    //this will be like references[0]: [references[0].name : 'test', etc]
    //for each one create a FreeFormReference
    def _ref = new ConcreteReference(ref.value.collectEntries{it -> [it.key.replace(ref.key + '.', ''),  it.value]})
    log.info('created reference ${_ref}')
    parent.addToReferences(_ref)
}