0

Event Instance問題は、 aを a にリンクすることにありTag Instanceます。これでイベントを保存すると...しかし、1つのタグが複数のイベントに関連付けられる可能性があり、1つのイベントには0から多くのタグが含まれる可能性があるため、設計上の問題が残ります。

標準save()メソッドでは、メソッド内で呼び出します。このメソッドtagInput()は、フォームから文字列を取得しtagsCollection field(スクリーンショットを参照)、単語を区切り、のインスタンスを作成/保存Tagします(以下のメソッドを参照)。区切られた各値は、ログインしているユーザーにリンクされ、イベントにリンクされます。

全体的な問題は、タグ データベースの event_id が同じタグ名を使用する新しいイベントで上書きされないように、作成された各タグに複数のイベント インスタンス ID を追加する方法です。

カンマで区切られた複数のタグのデモ&ウェブページ&データベースのタグの結果: dbconsole

ユーザー クラス( Grails セキュリティ プラグインで使用)

static hasMany = [tags : Tag]

Tag クラス( Tag Cloud Grails Plugin で使用)

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はTag インスタンスに保存されますが、同じユーザーに同じタグを再利用すると問題が発生します。これは、検索機能のために関連する複数のイベント 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 つのタグSEE DATABASE SCREENSHOTを作成した最初のイベントで1 人のユーザーを使用し、次に同じユーザーで2 番目のイベントを作成し、最後のイベントt1 & t5で以前に作成された 2 つのタグを使用しました)

4

2 に答える 2

0

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

あなたはできません、そしてあなたもそれをする必要はありません。定義上、ドメインクラスにはEventプロパティが含まれていないため、TagインスタンスはEventインスタンス参照を必要としません。

したがって、タグインスタンスを作成して、イベントインスタンスを永続化せずに保存できます。つまり、保存されたtagInstancesリストをtagInput()メソッドから返すだけです。save()メソッドに戻り、eventInstanceを保存した後、次のようなタグリストを追加します。

tagInstancesList.each{tagInstance->
    eventInstance.addToTags(tagInstance)
}
于 2013-01-08T05:28:18.240 に答える
0

[イベントを作成しているので、それに伴って新しいタグを作成する必要がある場合があります。

したがって、保存してタグにカスケードするためにも、タグ クラスに所属先を定義する必要があります。

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

今、あなたは言うことができます:

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

またevent.save()、新しいタグを保存する必要があります。

編集:あなたnew TagはおそらくのようなものでなければなりませんTag.findOrCreateByUserAndTag(user, name)。これにより、タグが既に存在する場合は検索され、存在しない場合は作成されます。明らかに、ユーザー変数と名前変数を作業中のものに置き換えます。

于 2013-01-08T05:46:46.847 に答える