Grails:通过父对象关联子对象列表中的对象

Grails:通过父对象关联子对象列表中的对象,grails,gsp,Grails,Gsp,我有三个目标 class Registrant { String firstName String lastName List<EventRegistration> events = [].withLazyDefault { new EventRegistration() } static hasMany = [ events: EventRegistration ] } class EventRegistration { static belo

我有三个目标

class Registrant {
  String firstName
  String lastName

  List<EventRegistration> events = [].withLazyDefault { new EventRegistration() }

  static hasMany = [
    events: EventRegistration
  ]
}

class EventRegistration {
  static belongsTo = [ registrant : Registrant ]
  Event event
  Integer numberOfTickets
}

class Event {
  String title
}

这并不能节省时间。有没有办法将事件与EventRegistration关联,以便注册人可以保存它?

因为控制器中绑定的范围是注册人,所以不需要在events元素前面加上注册人。从你的标签上移除它,绑定就可以了

<table>
  <thead>
    <tr>
      <th>Title</th>
      <th># of Tickets</th>
    </tr>
  </thead>
  <tbody>
    <g:each var="event" in="${Event.list()}" status="s">
    <tr>
      <td>${event.title}</td>
      <td><g:field type="text" name="events[${s}].numberOfTickets"/>
      <g:field type="hidden" name="events[${s}].event.id" value="${event?.id}"/></td>
    </tr>
    </g:each>
  </tbody>
</table>

标题
#票的数量
${event.title}

您的控制器代码是什么样子的?您可能不需要注册人。在您的域名称中。添加控制器代码请尝试删除注册者。在标记名中。这很有效。。。你想作为我可以接受的答案提交吗?是的,作为答案添加了它。作为一个旁注,您应该考虑将事件.List.()移到控制器中,并将其传递到模型中。最好在控制器中和视图外继续构建模型。
@Transactional(readOnly = true)
class RegistrantController {

  def index() {  
  }

  def load(Registrant registrant){
    render(view: "load", model:[registrant:registrant])
  }

  @Transactional
  def save(Registrant registrant) { 

    println registrant?.events

    if (registrant == null){
      flash.message = "registrant.save.not.found"
      render view:'index'
      return
    }

    if (registrant.hasErrors()) {
      flash.message = "registrant.save.errors"
      render view:'index', model:[registrant:registrant]
      return
    }

    if (registrant.save(flush:true)) {
      redirect action: "load", id:registrant.id 
    }
    else {
      flash.message = "registrant.save.errors"
      render view:'index', model:[registrant:registrant]
      return
    }
  } 
}
<table>
  <thead>
    <tr>
      <th>Title</th>
      <th># of Tickets</th>
    </tr>
  </thead>
  <tbody>
    <g:each var="event" in="${Event.list()}" status="s">
    <tr>
      <td>${event.title}</td>
      <td><g:field type="text" name="events[${s}].numberOfTickets"/>
      <g:field type="hidden" name="events[${s}].event.id" value="${event?.id}"/></td>
    </tr>
    </g:each>
  </tbody>
</table>