0

これがコードなのかテストなのかはわかりません。

オブジェクトのステータス変更とそれらの変更履歴を追跡する必要があります。最新のステータスのみを表示する必要がある場合もあれば、履歴リスト全体が必要な場合もあります。

当初、私たちはドキュメント (grails.org/doc/2.2.x/ref/Database%20Mapping/sort.html) とこの男が見つけたもの (stackoverflow.com/questions/12482995/sort-a- collection-in-grails-by date ) であり、ゴールデンでした。

単体テストの時間に来て、2 つのステータスを作成し、最新のものをプルするテストを作成しました。ビンゴそれは動作します。次に、トラブル。ランダムな間隔で、テストは失敗します。つまり、ソートが機能しないことについてこの男が発見したことを見つけているようです。明らかな何かを見落としているのかもしれませんが、新鮮な目で見られることを願っています。

class mainObject {
    static hasMany = [ statusHistory : StatusHistory]

    static mapping = {
           sort id: 'asc'
           statusHistory sort:"statusDate"
    }


 String getCurrentStatus(){
     if (!this.statusHistory){
         return""
     }else{
         this.statusHistory.sort{it.sstatusDate}
         return statusHistory.status.first()
     }
 }
}


class statusHistory {

     static mapping = {
        sort statusDate: "asc"
     }

 static belongsTo = [ mainObjects : MainObject]

 Date statusDate
 String strStatus
 String notes

 String toString(){
    if (statusDate ==null){
        return "${strStatus}" + " - No Date"
    }else{
        return "${strStatus}" +" - "+ "${statusDate.getDateString()}"
    }
 }
}

単体テスト

@TestMixin(GrailsUnitTestMixin)
class MainObjectTests {

    def util = new UnitTestUtil()
    def mockMainObj

    @Before
    void setUp {

          mockMainObj = util.initMockMainObj()
          mockForConstraintsTests(MainObject, [mockMainObj])
     }

    void testgetCurrentStatus(){
        assertEquals("", mockMainObj.getCurrentStatus())

        def mockObjStatus1 = util.initMockStatus(mockMainObj, new SimpleDateFormat(dd/MM/yyyy hh:mm:ss).parse("01/12/2008 15:00:00"), "First Status")
        mockDomain (StatusHistory, [mockObjStatus1])
        mockForConstaintsTests (StatusHistory, [mockObjStatus1])
        mockObjStatus1.save()
        assertEquals(1, mockMainObj.statusHistory.size())
        assertEquals("First Status", mockMainObj.getCurrentStatus())

        def mockObjStatus2 = util.initMockStatus(mockMainObj, new Date(), "Latest Status")
        mockDomain (StatusHistory, [mockObjStatus2])
        mockForConstaintsTests (StatusHistory, [mockObjStatus2])
        mockObjStatus2.save()
        assertEquals(2, mockMainObj.statusHistory.size())
        assertEquals("Latest Status", mockMainObj.getCurrentStatus())

    }
 }

このブログと Beckwith 氏 ( www.infoq.com/presentations/GORM-Performance )

しかし、私はドキュメントに戻って自分のコードを見て、それが正しいと考え続けています。だから私は今循環参照にいます。どんな助けでも大歓迎です。

4

1 に答える 1

1

同僚から - これにはいくつかの解決策があるかもしれませんが、これが私のアプローチです。最初の値を取得するために hasMany コレクションを使用しないでください。順序を特定できないためです (Grails にはバグがある可能性があります)。代わりに、1 つのクエリを使用して値を取得します。getCurrentStatus() メソッドを次のように置き換えてみてください。

String getCurrentStatus() {
            StatusHistory.createCriteria().get() {
                            eq(‘mainObjects’, this)

                            maxResults(1)
                            order(‘statusDate, ‘asc’)

                            projections {
                                            property(‘strStatus’)
                            }
            }
}

これにより、現在の MainObject の最も古い strStatus のみが StatusHistory から取得されます。すべての履歴を取得してから最初の履歴のみを選択するよりもパフォーマンスが向上します。

これで問題は解決したようです

于 2013-03-29T15:41:10.120 に答える