0

私はGrails開発に不慣れです。

私はこのようなドメインクラスを持っています:

class DaySchedule {
    Date Todaysdate
    String startTime;
    String endTime;
    String task
    int priority 
    boolean completed
    static belongsTo = [ schedule : Schedule ]
}

いくつかのテストデータでブートストラップしました。今、次の条件でクエリを実行したいと思います:

  • 特定の に属するtask( に格納されている)それぞれを選択する必要があります。bootstrap.groovyTodaysdate

たとえば、次のステートメントが my にある場合BootStrap.groovy:

//other codes
def daySchedule3 = new DaySchedule(Todaysdate:new Date(),
                startTime:"6pm",endTime:"10pm",
                task:"ReaD git...",completed:false)
def daySchedule4 = new DaySchedule(Todaysdate:new Date()+1,
                startTime:"10am",endTime:"12pm",
                task:"Read MySQL....",completed:false)

明らかにtask、は 1 日にReaD git...属します (これは、私が通っnew Date()た今日です)。

これらを見つけるために、次のような部分的な解決策を思いつきました。

        def allTasks = DaySchedule.findAllByTaskIsNotNull()
        def dates  = allTasks.collect { it.Todaysdate }
        def tasks = dates.collect { 
                    def queryParameter = new DaySchedule(Todaysdate:it)
                    def todaysWork = DaySchedule.findAll(queryParameter)
                    todaysWork.task 
        }

このコードに問題があります。collectEntriesメソッドをdatesandで使用できなかったため、値を としてtasks特定の日付 (つまり) のマップに変換しました。(これは私が試したものです!)datestasks

今、私は一人ぼっちです。datesがどれにtasks属しているかを推測する方法を見つけることができませんでした。

それに対する他の解決策はありますか?

前もって感謝します。

4

2 に答える 2

1

すべてのドメインオブジェクトについて、日付のキーとタスク名の値を含むマップを取得しようとしているようですDaySchedule。試してみてくださいCollection.groupBy。例えば:

def allTasks = DaySchedule.findAllByTaskIsNotNull()

def tasksByDate = [:] // start with empty map

tasksByDate.putAll(
    allTasks.groupBy { task ->
        // group by just the date portion, ignoring time
        // clone since clearTime modifies original
        task.todaysDate.clone().clearTime()
    }.collect { date, daySchedule ->
        // change from map of date -> daySchedule to map of date -> task
        [date, daySchedule.task] as MapEntry
    }
)
于 2011-12-19T16:26:08.887 に答える
1

どこかに設計上の問題があると思います...次のようなものの方が簡単です:

class Task {
    Date startTime;  
    Date endTime;
    String description
    int priority 
    boolean completed
    static belongsTo = [ schedule : Schedule ]

    String toString() {
        return "${description} : from ${startTime} to ${endTime}"
    }

}

次に、次のように、タスクが含まれるすべての日付を一覧表示できます。

java.text.DateFormat df = java.text.DateFormat.getDateInstance(DateFormat.LONG, Locale.US);

def days = Task.list().collect {
      df.format(it.startTime);
}.unique()

これで、"days" 変数には、データベースに存在する一意の日の文字列の配列と、関連付けられたタスクが含まれます。

タスクを日ごとにリストしたい場合は、次のようにします。

days.each { dayString ->
    def date = df.parse(dayString)
    def dayTasks = Task.findAllByStartTimeBetween(date, date+1)
    println "Tasks for ${dayString}"
    dayTasks.each {
        println "    - ${it}"
    }
}
于 2011-12-19T17:46:18.643 に答える