2013-06-17 5 views
0

Я пытаюсь реализовать «объемную» вставку для hasMany. И получил его на 90%, но попал в икоту с моим дизайном поликласса. У меня есть модель, какGrails hasMany bulk create

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> 

Но вопрос всегда создает конкретный тип (класс = . 'domain.Reference'), так что «имя ребенка всегда нуль

Я использовал:

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], создать его, а затем добавить в родительский?

надеюсь, что это ясно, дайте мне знать, если вам нужно какое-либо разъяснение.

+1

'ConcreteReference расширяет Reference' является то, что вы имели в виду? – dmahapatro

+0

Является ли 'Reference' абстрактным классом? Если да, есть ли у вас 'Reference' внутри' grails-app/domain' или 'src/groovy'? – dmahapatro

+0

Я не уверен, в чем проблема, но я проверил ваш код, он отлично работает для меня. Единственное отличие состоит в том, что я не отправляю из формы, но иду с вызовом REST. Я хочу, чтобы я мог отправить свою настройку в качестве ответа для вас (не хотел загромождать ваш вопрос) – dmahapatro

ответ

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) 
} 
Смежные вопросы