显示Grails One to Many关系的顺序

时间:2012-09-01 07:38:39

标签: grails groovy grails-domain-class

我有两个域类,如下所示

class Quiz {
    String name
    String description
    int duration
    User user
    int points
    static hasMany = [questions:Question]
}

class Question {
    String question
    String questionType
    int points  
    String option_1
    String option_2
    String option_3
    String option_4
    boolean isOption_1_Correct
    boolean isOption_2_Correct
    boolean isOption_3_Correct
    boolean isOption_4_Correct
    User user
    static belongsTo = [user:User]
}
测验课中的

static hasMany = [问题:问题]让我的生活变得更轻松。我也明白它可以使用addTo和removeFrom等便利方法。只有查询我才希望用户能够定义问题的显示顺序。有没有更简单的方法来执行此操作,还是必须创建一个映射类,如下所示?

class QuestionInQuiz {
    Quiz quiz
    Question question
    int displayOder
    static constraints = {
        question unique:['quiz']
    }
}

如果我能以某种方式避免使用这个映射类并保持我的代码更简单,那将是很棒的!

2 个答案:

答案 0 :(得分:0)

您可以向position课程添加Question属性。您应该向mapping类添加Quiz静态闭包:

static mapping = {
    questions sort:'position'
} 

然后您应该将QuestionQuiz - >相关联。 belongsTo = [user: User, quiz: Quiz]

我相信您可以优化模型创建Option类和枚举QuestionType如果明天您有5个或6个选项的问题,会发生什么?您想要重写,重新测试,重新编译和重新部署代码吗?

或者您可以在问题中实施Comparable界面并创建SortedSet个问题

class Quiz {
    SortedSet questions
    String name
    String description
    int duration
    User user
    int points
    static hasMany = [questions:Question]
}

class Question implements Comparable<Question> {
    String question
    String questionType
    int points  
    int position
    String option_1
    String option_2
    String option_3
    String option_4
    boolean isOption_1_Correct
    boolean isOption_2_Correct
    boolean isOption_3_Correct
    boolean isOption_4_Correct
    User user
    static belongsTo = [user:User]

    int CompareTo(obj){
        position <=> obj.position
    }
}

答案 1 :(得分:0)

如果你添加

List questions

Quiz课程(除了hasMany)之外,GORM会使用List作为关联,而不是默认的无序SetGrails docs解释详情。