0

我是 grails 的新手,正在尝试构建一个具有一对多关系的小型应用程序,但我被卡住了。

所以存在三个域类Artist、Album 和Song。意图是双重嵌套的 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 有效地传递到第二个视图中,以便在提交第二个表单时可以使用它来正确保存每首歌曲?我看过这篇文章,它确实相关,但它并没有尝试将数据保存到多个视图中。

我希望这个问题有一定的意义,我感谢任何反馈......包括替代方法。

4

1 回答 1

0

在相册控制器的 save() 方法中,使用如下参数渲染第二个视图:

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]
     ...
}
于 2013-01-03T02:31:47.213 回答