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 つのタグを使用しました)