连接表+额外列的Grails很多

时间:2016-01-29 20:23:43

标签: grails gsp grails-3.0

我需要创建一个自定义连接表来重新建模多对多映射,然后在这里发布一些很棒的帖子,提出了下面的模型。

现在我的问题是,如果我在GSP中有一个课程或旅程对象,我该如何访问属于连接表的额外列数据。

在这个例子中,如果我有一个旅程或课程实例,我想在我的GSP中的CourseJourneyDetail中访问名为extraColumn1的字段

我尝试了以下内容:

$ {course.courseJourneyDetail.extraColumn1}

但它不起作用。

以下是我的域类的相关部分:

    class Course {

        static hasMany = [journies:         CourseJourneyDetail]

        String courseName
        String organisersDescription


        Set<Journey> getJournies() {
            return CourseJourneyDetail.findAllByCourse(this)*.journey
        }
    }

    class Journey {

        static hasMany = [courses: CourseJourneyDetail]

        java.util.Date dateCreated
        java.util.Date lastUpdated
        boolean enabled = true

        User user


        Set<Course> getCourses() {
            return CourseJourneyDetail.findAllByJourney(this)*.course

        }
}

class CourseJourneyDetail  implements Serializable {

    String extraColumn1

    static belongsTo = [course: Course, journey: Journey]

    boolean equals(other) {
        if (!(other instanceof CourseJourneyDetail)) {
            return false
        }

        other.journey?.id == journey?.id &&
                other.course?.id == course?.id
    }

    int hashCode() {
        def builder = new HashCodeBuilder()
        if (course) builder.append(course.id)
        if (journey) builder.append(journey.id)
        builder.toHashCode()
    }

    static constraints = {
    }

    static mapping = {
        version false
        id composite: ['course', 'journey']
    }
}

1 个答案:

答案 0 :(得分:1)

由于您已确定每个Course / Journey都有CourseJourneyDetail的集合而不是单个实例,${course.courseJourneyDetail.extraColumn1}将不起作用(因为您已经发现了。

如果你将你的groovy表达式分解为:course.courseJourneyDetail,那么根据你创建的关系,它就没有意义。原因是,Course没有一个CourseJourneyDetail,而是一个集合。

如果您希望CourseJourney建立一对一的关系,但使用包含其他列的联接表,那么您的域结构需要更改以反映这一点:相反与在每个类中使用static hasHany相比,您将切换到单个实例。

如果您希望保持多对多关系,那么您需要考虑如何获取表示关联的适当连接对象。一个例子:

CourseJourneyDetail.findAllByCourseAndJourney(<courseInstance>, <journeyInstance>)

如果您希望为所有多对多关联收集其他列,则可以使用您已在续订方法中使用的语法(getJourniesgetCourses):< / p>

course.journies*.extraColumn1

这将输出一个字符串数组,因此它的用法在${}表达式中不太有意义;在g:each内更有意义。这完全取决于您计划如何使用这些数据。