Grails关系涉及多个表,可能多对多

时间:2013-01-08 04:20:44

标签: grails gorm relationship tag-cloud

问题在于将Event InstanceTag Instance相关联。在保存时, 现已实现 ...但仍有设计问题,因为一个标记可能与多个事件相关,并且一个事件可以有0到多个标签。

在标准save()方法中,我在方法tagInput()内调用,该方法从tagsCollection field参见屏幕截图)中获取字符串,该字符串将单词和创建/保存 Tag的实例(请参阅下面的方法)。每个分隔的值都链接到登录用户,现在链接到事件事件。

总体问题是如何将多个事件实例ID添加到每个创建的标记中,以便Tag数据库中的event_id不会被使用相同标记名称的较新事件覆盖。

Demo of multiple tags separated via comma& Result of tags on webpage& Database: dbconsole

用户类与Grails安全插件一起使用

static hasMany = [tags : Tag]

标记类用于Tag Cloud Grails插件

String tag
int times
User user
// Think this needs changing to hasMany i.e. many tags, many events linked to a tag
static belongsTo = [event: Event]

活动类

String tagsCollection
User user
static hasMany = [tags: Tag]

现在事件ID 正在保存到标记实例,但是对于同一个用户重复使用相同的标记会有问题,因为它需要具有多个相关事件ID 用于搜索能力的可能性。

def tagInput(Event e) {
    //Stores tags sperated via comma in an array from the eventInstance tagCollection string field
    def tagArray = e.tagsCollection.replaceAll("\\s+","").toLowerCase().split(",")

    tagArray.each { aVar ->
        def splitTag = Tag.findByTag(aVar)
        //If the tag already exists for the current user logged in
        if (Tag.findByTag(aVar) && splitTag.userId == lookupPerson().id) {
        //Lookup person spring security method
        //+1 to how many times that tag has been used
            splitTag.times++

            //TODO IMPLEMENT A WAY TO APPEND EVENT ID TO TAG EVENT_ID FIELD

            splitTag.save(flush: true, failOnError: true)
        }  else {
            //if tag doesn't exist, create a new one using current logged in user
            def nTag = new Tag(tag:aVar, times: 1, user:lookupPerson())
           //SUGGESTION to save event id to a tag
            e.addToTags(nTag)
            e.save()
            //Set a user to own this tag
            def u = User.find(lookupPerson())
            nTag.save(flush: true, failOnError: true)
            u.addToTags(nTag)
            u.save()
        }
    }
}

(测试我使用一个用户第一个事件创建了5个标签 查看数据库屏幕显示 ,然后使用相同用户创建了第二个事件,并在最后一个事件 t1 中使用了以前创建的两个标记 & t5

2 个答案:

答案 0 :(得分:0)

how can I add an event instance id to each of the tags created, when the id hasn't been created yet ...

你不能,而且你也不需要这样做。根据定义,Tag实例不需要Event实例引用,因为域类中不包含Event属性。

因此,您可以创建标记实例并在不保留事件实例的情况下保存它:只需从tagInput()方法返回已保存的tagInstances列表。回到save()方法,保存eventInstance后,用这样的东西添加标签列表:

tagInstancesList.each{tagInstance->
    eventInstance.addToTags(tagInstance)
}

答案 1 :(得分:0)

[所以你要创建一个事件,你可能需要随之创建新的标签。

因此,为了保存级联到标记,您必须在标记类上定义belongsTo:

class Tag {
...
static belongsTo = [Event, User]
}

现在你可以说:

Event event = new Event(...)
event.addToTags( new tag(...) )

event.save()也应保存新标记。

修改:您的new Tag应该类似于Tag.findOrCreateByUserAndTag(user, name)。这将找到标签,如果它已经存在,如果它不存在,它将创建它。显然用您正在使用的内容替换用户和名称变量。