【问题标题】:Display order for grails One to Many relationshipgrails 一对多关系的显示顺序
【发布时间】:2012-09-01 07:38:38
【问题描述】:

我有两个域类如下

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]
}

测验课中的静态 hasMany = [questions:Question] 让我的生活变得轻松多了。我也知道它将能够使用 addTo 和 removeFrom 等便捷方法。我唯一的查询是我希望用户能够定义问题的显示顺序。有没有更简单的方法可以做到这一点,还是我必须创建一个如下所示的映射类?

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

如果我能以某种方式避免使用这个映射类并让我的代码更简单,那就太好了!

【问题讨论】:

    标签: grails groovy grails-domain-class


    【解决方案1】:

    如果你添加

    List questions
    

    到您的Quiz 类(除了hasMany),GORM 将使用List 进行关联,而不是默认的无序Set。 Grails docs解释详情。

    【讨论】:

      【解决方案2】:

      您可以将position 属性添加到Question 类。您应该在 Quiz 类中添加一个 mapping 静态闭包:

      static mapping = {
          questions sort:'position'
      } 
      

      那么你应该将Question 与Quiz 链接起来 -> belongsTo = [user: User, quiz: Quiz]

      我相信您可以改进您的模型,创建一个 Option 类和一个枚举 QuestionType 如果明天您有一个包含 5 或 6 个选项的问题会怎样?您想重写、重新测试、重新编译和重新部署您的代码吗?

      或者您可以在 Question 中实现Comparable 接口并创建SortedSet of questions

      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
          }
      }
      

      【讨论】:

      • 你是对的,我尝试创建选项类,但实现它的工作量太大:) 如果需要,我准备添加多达 20 个选项。我对 Options 类的最大问题是在创建问题本身的同时创建选项,而不是一个接一个!
      • 如果我收到此错误“在多对多关系中的域类 [class com.easytha.Question] 和 [class com.easytha.Quiz] 之间没有定义所有者”,我该怎么办。示例:静态 belongsTo = com.easytha.Quiz'?
      • 你应该在Question类中编辑static belongsTo = [user:User, quiz: Quiz]
      • 但这会让一个问题只属于一个测验,不是吗?
      • 或者至少按测验的顺序不是?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多