知道其在Grails中的ID,提取对象的实际值

时间:2013-05-31 05:58:13

标签: grails groovy switch-statement constraints findby

我正在尝试创建一个新的Project实例(下面给出了代码),但是约束不允许我这样做,因为项目不是看到名字而是生成id。例如,代替'目标'(名称),它获得'3'('目标'名称的ID)。我的同事告诉我创建一个服务,它将根据id返回属性的实际名称,并从ProjectController调用该服务。我对groovy和grails语法不太熟悉,所以我不知道该怎么做。

我有一个带有name属性的Stage域类。在我的Bootstrap中,我为舞台加载了不同的名称。

 if (Stage.count() == 0) {
        new Stage(name: "").save()
        new Stage(name: "Not Started").save()
        new Stage(name: "On target").save()
        new Stage(name: "Off target").save()
        new Stage(name: "Late").save()
        new Stage(name: "Critically Late").save()
        new Stage(name: "Complete").save()
    } 

我还有一个具有Stage属性的Project类,我对这些阶段应用了一些约束:

class Project {

String name
Date dueDate
Date startDate

Stage requirements
Stage design
Stage development
Stage qa
Stage ua
Stage delivery
Date deliveryDue

static constraints = {
    name blank: false, unique: true
    dueDate min: new Date() - 1, max: new Date() + 365 * 10
    startDate min: new Date() - 1, max: new Date() + 365 * 10
    requirements inList: ["Not started", "Critically Late", "Off Target Date", "On target"]
    design inList: ["Not started", "Critically Late", "Off Target Date", "On target"]
    development  inList: ["Not started", "Critically Late", "Off Target Date", "On target"]
    qa inList: ["Not started", "Critically Late", "Off Target Date", "On target"]
    ua inList: ["Not started", "Critically Late", "Off Target Date", "On target"]
    delivery inList: ["Not started", "Critically Late", "Off Target Date", "On target"]
}
}

2 个答案:

答案 0 :(得分:0)

向您的域类添加toString()方法:

String toString() {
    name
}

答案 1 :(得分:0)

所以你真的试图限制阶段可以拥有的价值。您正在尝试使用inList和字符串,但是该对象不是String,而是Stage。

所以在Stage域上,我会创建一个类似的方法:

static List<Stage> projectStages() {

 Stage.findAllByNameInList(["Not started", "Critically Late", "Off Target Date", "On target"])

}

然后在你的验证中:

requirements inList: Stage.projectStages()

我认为我从未试图从默认验证器调用静态方法,所以如果这不起作用:

requirements validator { val, obj -> Stage.projectStages().contains(val) }