我是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>
答案 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>
您还可以实施Room
类toString()
方法,因为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提供信息的所有相关信息,但也有例外情况,例如某些辅助细节。