Grails控制器动态查找器

时间:2011-05-22 23:45:51

标签: grails controllers

我是Grails的新手,所以我需要帮助解决这个问题。想象一下,我有这些课程:

Class User{
String name
String nr

}

class Computer{

String processor
String ram
User user
}

Class Room{
String roomNr
Computer computer
}

我想做一个像这样的控制器:

def print= {

        def user = User.get(1)

        def computer = Computer.findAllByUser(user) // all computers filtered by User

        [computer: computer]       
    }

控制器运行良好,但我希望不仅能够传递计算机实例,还能传递具有该计算机ID的Room。我不知道该怎么做,但会是这样的(同样的控制器,同样的动作):

def print = {

        def user = User.get(1)

        def computer = Computer.findAllByUser(user) // all computers filtered by User
        def room = Room.findAllByComputer(computer) ##

        [computer: computer]       
    }

嗯,这是错误的,因为,###是,'computer'表示id的列表,而不是单个id。当我传递一个要在我的gsp中打印的计算机列表中的g:每个标签都是这样的:(它。处理器,它.Ram)。我不知道如何获得在每个标签中使用当前计算机的所有房间。这有点难以解释,但基本上我的输出将是:

<g:each in="${computer}"
Computer1:
Processor: ${it.processor}
Ram: ${it.ram}
Room: ????? (How to get here??)
</g:each>

4 个答案:

答案 0 :(得分:2)

使双向关系。现在你存储哪个房间有哪台电脑,但你没有其他方向,所以你可以跟随电脑到它的房间。看看

http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20(GORM).html

特别是第5.2.1.2节,关于双向一对多关系。

请注意,Grails是基于最佳技术的。其中一个就是休眠。熟悉基础技术只会对您有所帮助。

所以,我得到的是你的计算机类应该引用它所在的房间。房间类应该有一个计算机列表(假设一台计算机可以在一个房间里) 。您将遇到的困难在于理解hibernate的级联行为,这取决于您如何建立关系。如果您遇到问题请更新此问题或开始一个具有特定问题的新问题。

答案 1 :(得分:1)

我想出了类似的东西,但我没有测试它。

控制器:

def print = {

  def user = User.get(1)
  def computer = Computer.findAllByUser(user)
  def rooms = [:]

  // get rooms for that computer
  computer.each{

    def computerRooms = Room.findAllByComputer(it) // find all rooms where current computer is
    rooms.put(it.id, computerRooms) // map all the rooms with computer id

  }

  [computer: computer, rooms: rooms]      
}

查看:

<g:each in="${computer}">
  Computer1:
  Processor: ${it.processor}
  Ram: ${it.ram}
  Rooms: <g:join in="${rooms[it.id]}" delimiter=", "/>
</g:each>

客房地图使用计算机ID作为密钥,并将该计算机作为值的所有房间列表。当然如果我理解正确的话;)

修改

如果您需要访问会议室详细信息,可以将join标记替换为另一个each标记,如下所示:

<g:each in="${computer}" >
  Computer1:
  Processor: ${it.processor}
  Ram: ${it.ram}
  Rooms: <br/>
  <g:each in="${rooms[it.id]}">
    Room id: ${it.id}
    Room number: ${it.number}
  </g:each>
</g:each>

您还可以实施RoomtoString()方法,因为join标记使用它来呈现文字:

Class Room{
  String roomNr
  ...

  String toString(){
    roomNr
  }
}

现在,当您在join类实例列表中使用Room标记时,它将打印房间号。

答案 2 :(得分:0)

看起来您没有将房间变量发送到视图

[computer: computer]

应该是:

[computer:computer, room:room]

答案 3 :(得分:0)

您可以使用&lt; g:set&gt;在&lt; g:each&gt;中获取房间参考。这样,控制器不关心房间。通常,我喜欢收集在控制器中为GSP提供信息的所有相关信息,但也有例外情况,例如某些辅助细节。