2013-01-03 50 views
0

我是grails的新手,嘗試構建一個具有一對多關係的小應用程序,並且我被卡住了。Grails中的多個表單中的多個嵌套域

所以有三個領域類藝術家,專輯和歌曲。意圖是雙重嵌套的1→m關係:

藝術家可以有許多專輯,並且專輯可以有許多歌曲。

class Artist { 

    List albums = new ArrayList() 

    static hasMany = [albums: Album] 

    String artistName 

    static mapping = { 
     albums cascade:"all-delete-orphan" 
    } 
} 

    class Album { 

    String albumName 
    String albumDescr 

    static belongsTo = [artist: Artist] 

    List songs = new ArrayList() 
    static hasMany = [songs: Song] 

    boolean deleted 
    static transients = [ 'deleted' ] 


    static mapping = { 

     songs cascade:"all-delete-orphan" 
    } 
} 

    class Song{ 

    Album album 
    static belongsTo = [album: Album] 
    String songName 
    Integer trackNumber 

    boolean deleted 
    static transients = [ 'deleted' ] 
} 

我想用一系列的表格來處理數據的輸入。在第一個視圖中,藝術家將使用任何關聯的相冊創建。這種觀點將類似於這裏所描述的 觀點:http://omarello.com/2010/08/grails-one-to-many-dynamic-forms/

在提交表單的藝術家和相關的歌曲將被保存(類似下面)

def artist = new Artist(params) 
artistGroup.save() 

這裏是我所需要的零件幫助......

下一個視圖將顯示使用上一個視圖創建的相冊並提示用戶爲每個相冊添加歌曲信息。提交此表後 歌曲將被保存。

我想我會通過保存的相冊,因此他們可能被顯示在第二顯示快閃範圍

flash.myAlbums = artist.albums 

。但是,顯示專輯名稱只是故事的一部分,因爲我們需要Album.id以保存每首 歌曲(並正確地關聯其專輯)。如何將此ID有效傳遞到第二個視圖中,以便在提交第二個表單時可以正確保存每首歌曲?我已經看到這個post,它確實有關係,但它不會試圖將數據保存到多個視圖中。

我希望這個問題有道理,我很欣賞任何反饋......包括替代方法。

回答

0

在你的專輯控制器的save()方法,使第二種觀點與像PARAMS:

Class AlbumController { 
    ...... 
    def save() { 
     def artist = new Artist(params) 
     artist.save()      //the original artistGroup.save() won't work 
     params.albumsSelected.each{album->   //for instance, you can pass all the album_id related to the artist in this parameter 
      def albumInstance = Album.get(album) 
      artist.addToAlbums(albumInstance) 
     } 
     render(view:'showAlbum', params:[albums:artist.albums]) 
    } 

    def addSong() { 
     def albumSelected = Album.get(params.album) 
     def songToAdd = Song.findBySongName(params.songName) 
     albumSelected.addToSongs(songToAdd) 
     ...... 
    } 

showAlbum.gsp:

... 
<g:form name="addSong" action="addSong"> 
    <g:select name="album" 
      from="${albums}" 
      optionKey="id" 
      optionValue="albumName" /> 
    <g:textField name="songName"/> 
    <g:submitButton name="add" value="Add To Album" /> 
</g:form> 
... 

而且你還需要刪除重複的屬性定義在您的域名分類中:

class Song{ 
// Album album is not needed when there is a 'belongsTo' definition 
    static belongsTo = [album: Album] 
    ... 
} 
+0

Jinzhao - 謝謝你的解釋國家。 save()函數是否必須位於相冊控制器中?這個邏輯可以存儲在一個單獨的控制器中嗎(不是綁定到一個域)?我有一個名爲registerartist的控制器,我希望可以使用,但是我注意到,當我將params作爲上面的模型傳遞時(params:[albums:artist.albums])似乎沒有任何東西能夠通過。再次感謝您抽出寶貴時間來幫助我......非常感謝! – Dennis

+0

[save()](http://grails.org/doc/latest/ref/Domain%20Classes/save.html)是Grails附帶的方法。您可能需要閱讀[Grails教程](http://grails.org/doc/latest/guide/gettingStarted.html#creatingAnApplication)以瞭解基本的第一項。 – coderLMN