0

我是 Grails 开发的新手。

我有一个这样的域类:

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

我已经引导了一些测试数据。现在我想做一个查询,条件如下:

  • 我需要选择属于特定的每个task(存储在 中) 。bootstrap.groovyTodaysdate

例如,如果我在我的中有这些语句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,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在 and 上使用方法datestasks因此我将其转换为特定日期(即dates)的地图,其值为tasks. (这就是我尝试的!)

现在我一个人呆着。我无法找到一种方法来猜测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 回答