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



问题在于将Event Instance连接到Tag Instance。当保存时,一个已经完成的事件…但是设计问题仍然存在,因为一个标签可以与多个事件相关,一个事件可以有0到多个标签。

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

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

用逗号&网页上标签的结果&数据库:dbconsole

用户类 (用于Grails安全插件)

static hasMany = [tags : Tag]

标签类 (用于标签云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)

[所以你正在创建一个事件,你可能需要为它创建新的标签。

所以为了保存级联到标签上,你必须在标签类上定义一个belongTo:

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

现在你可以说:

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

event.save()也应该保存你的新标签。

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

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

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

因此,您可以创建标记实例并保存它,而不需要事件实例持久化:只需从tagInput()方法返回保存的tagInstances列表。回到save()方法中,在保存eventInstance之后,用如下方式添加标签列表:

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

相关内容

  • 没有找到相关文章

最新更新