0

私はgrailsを初めて使用し、1対多の関係を持つ小さなアプリケーションを構築しようとしていますが、立ち往生しています。

そのため、Artist、Album、Song の 3 つのドメイン クラスがあります。意図は、二重にネストされた 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

2 番目のビューに表示できるようにします。ただし、各曲を保存する (そしてそのアルバムを正しく関連付ける) には Album.id が必要になるため、アルバムの名前を表示することはストーリーの一部にすぎません。2 番目のフォームの送信時に各ソングを正しく保存するために使用できるように、この ID を 2 番目のビューに効果的に渡すにはどうすればよいでしょうか? この投稿を見たことがありますが、関連していますが、データの保存を複数のビューに分割しようとはしていません。

この質問がある程度理にかなっていることを願っています。これに対する代替アプローチを含むフィードバックに感謝します。

4

1 に答える 1

0

アルバム コントローラーの save() メソッドで、次のようなパラメーターを使用して 2 番目のビューをレンダリングします。

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 に答える