Контроллеры Grails динамические искатели - PullRequest
0 голосов
/ 23 мая 2011

Я немного новичок в 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]       
    }

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

def print = {

        def user = User.get(1)

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

        [computer: computer]       
    }

Ну, это неправильно, потому что, где### is, 'computer' представляет список идентификаторов, а не один идентификатор.Когда я передаю список компьютеров, которые будут напечатаны в моем gsp, внутри ag: каждый тег выглядит так: (it. Processor, it. Ram).Я не знаю, как получить все комнаты, которые используют текущий компьютер в каждом теге.Это немного сложно объяснить, но в основном мой вывод будет таким:

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

Ответы [ 4 ]

2 голосов
/ 23 мая 2011

сделать отношения двунаправленными. Прямо сейчас вы сохраняете, в какой комнате есть какой компьютер, но вы не идете другим путем, поэтому вы можете следовать за компьютером в его комнату. Проверить

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

в частности, раздел 5.2.1.2, о двунаправленных отношениях «один ко многим».

Имейте в виду, что Grails построен на лучших технологиях породы. Одним из них является спящий режим. Знание основных технологий только поможет вам.

Итак, после всего этого я получаю от класса вашего компьютера ссылку на комнату, в которой он находится. В классе комнаты должен быть список компьютеров (при условии, что в комнате может находиться более одного компьютера) , Трудность, с которой вы столкнетесь, заключается в понимании каскадного поведения гибернации, которое зависит от того, как вы устанавливаете отношения. Если у вас возникли проблемы, обновите этот вопрос или начните новый с конкретной проблемы.

1 голос
/ 23 мая 2011

Я придумал что-то подобное, но я не проверял.

Контроллер:

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>

Карта комнат использует идентификатор компьютера в качестве ключа и список всех комнат, где этот компьютер имеет значение. Конечно, если я вас правильно понял;)

EDIT

Если вам нужны подробности о комнате, вы можете заменить тег 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 class toString(), потому что тег join использует его для визуализации текста:

Class Room{
  String roomNr
  ...

  String toString(){
    roomNr
  }
}

Теперь, когда вы используете тег join в списке Room экземпляров класса, он будет печатать номер комнаты.

0 голосов
/ 23 мая 2011

Вы можете использовать , чтобы получить ссылку на номер внутри вашего . Таким образом, контроллер не касается комнат. Как правило, мне нравится собирать всю соответствующую информацию, которая передает GSP в контроллере, но есть исключения, как в случае некоторых вспомогательных деталей.

0 голосов
/ 23 мая 2011

Похоже, вы не отправляете переменную комнаты в представление

[computer: computer]

Должно быть:

[computer:computer, room:room]
...