Groovy findAll и каждый тег вопрос - PullRequest
1 голос
/ 08 января 2010

У меня есть следующие классы домена:

class User = {
       String username
       ... 
       Company company
 }

class Company {
    String name
    ...
}

То есть существует отношение n: 1 между пользователем и компанией. Эти классы такие, и я не могу их изменить.

На show.gsp я хочу получить подробную информацию о компании вместе со ссылками на пользователи, которые принадлежат этой компании.

Я знаю, что могу добиться этого путем написания собственного тега, но я уверен, что это возможно при использовании тега each или тега findAll .

Если я сделаю следующее

<g:each in="${User.findAll('from User order by username')}" var="userInstance">
    <li><g:link controller="role" action="show"
         id="${userInstance.id}">${userInstance.encodeAsHTML()}</g:link>
   </li>
</g:each>

Я пытался передать $ {companyInstance} в качестве параметра, но либо я получил исключение, либо оно не сработало.

Я также пытался использовать User.findAllByCompany .

При использовании:

<g:findAll in="${user}" expr="it.company == ${companyInstance}  ">

У меня пустой набор.

Есть ли простой способ достичь этого без написания taglib?

Заранее спасибо.

Луис

Ответы [ 2 ]

0 голосов
/ 08 января 2010

Тег <g:findAll> выполняет итерацию по списку объектов, но не запрашивает БД, как это было сделано с User.findAll(..)

Правильный код:

<g:each in="${User.findAll('from User as u where u.company=:company order by username', [company: companyInstance])}" var="userInstance">
    <li><g:link controller="role" action="show"
         id="${userInstance.id}">${userInstance.encodeAsHTML()}</g:link>
   </li>
</g:each>

Если вы абсолютно хотите использовать g: findAll, то сначала вам нужно составить список пользователей следующим образом:

<% def users = User.listOrderByUsername()%>
<g:findAll in="${users}" expr="it.company == ${companyInstance}  "> 

Надеюсь, это поможет,

С уважением,

Фабьен.

0 голосов
/ 08 января 2010

Это проще, чем вы думаете: ${userInstance.company.encodeAsHTML()}

...