PersonとCourseの2つのドメインを持つscaffoldedGrailsアプリケーションがあります。人はコースに属し、コースには多くの人がいます。選択したコースに関連付けられているすべての人を一覧表示するように、コースのshow.gspを変更しました。
私が遭遇している問題は、特定のコースのすべての個人を表示するリストに、データベース内の重複する姓の個人が表示されないことです。たとえば、「John Doe」、「Jane Doe」、「Joe Doe」、「Edward Smith」の4人がいる場合、リストには次の情報のみが表示されます。
- ジェーン・ドウ
- エドワード・スミス
ただし、4人全員がデータベースに存在します。さらに、/ person/listにはすべての名前が表示されます。したがって、問題はコースに関連付けられている人のリストにのみあります。以下の関連コードを参照してください。何かご意見は?
個人ドメイン:
class Person implements Comparable {
static mapping = { sort lastName: "asc" }
// Needed to sort association in Course domain (due to Grails bug)
int compareTo(obj) {
lastName.compareToIgnoreCase( obj.lastName );
}
String firstName
String lastName
String email
Course course
static belongsTo = [ course:Course ]
static constraints = {
firstName size: 1..50, blank: false
lastName size: 1..50, blank: false
email email: true
course()
firstName(unique: ['lastName', 'email'])
}
String toString() {
return this.lastName + ", " + this.firstName;
}
}
コースドメイン:
class Course {
int maxAttendance
SortedSet persons
static hasMany = [ persons:Person ]
static mapping = {
persons cascade:"all-delete-orphan"
}
def getExpandablePersonList() {
return LazyList.decorate(persons,FactoryUtils.instantiateFactory(Person.class))
}
static constraints = {
maxAttendance size: 1..3, blank: false
}
}
コースのshow.gspを変更しました:
<g:if test="${courseInstance?.persons}">
<br />
<table>
<thead>
<tr>
<th>#</th>
<g:sortableColumn property="person"
title="${message(code: 'person.lastName.label', default: 'Person')}" />
</tr>
</thead>
<tbody>
<g:set var="counter" value="${1}" />
<g:each in="${courseInstance.persons}" status="i" var="p">
<tr class="${(i % 2) == 0 ? 'even' : 'odd'}">
<td>
${counter}
</td>
<td class="property-value" aria-labelledby="persons-label"><g:link
controller="person" action="show" id="${p.id}">
${p?.encodeAsHTML()}</td>
</tr>
<g:set var="counter" value="${counter + 1}" />
</g:each>
</tbody>
</table>
</g:if>