0

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>
4

1 に答える 1

2

関連付けにSortedSetを使用しましたが、Person'scompareToは、同じ名前の2人を同一と見なします。したがって、同じ名前の2番目以降の人は最初からセットに追加されません。

于 2013-02-17T19:54:36.947 に答える