3

私のアプリケーションには、フォト アルバムや個々の写真と同じ論理関係を持つドメイン クラスがあります。関連付けにを使用するListhasMany、位置フィールドや前/次のポインターを明示的に管理しなくても、個々のアルバム内での前後の移動がサポートされるはずです。

例えば:

class Album {
    static hasMany = [photos: Photo]
    List photos // Generates column `album_idx` in table for Photo.
    Integer size // Memoized.
}

class Photo {
    static belongsTo = [album: Album]
    static hasOne = [content: PhotoData] // PhotoData has byte[] field for data
}

class Controller {
    def prev() {
        def prevIdx = idx==0 ? album.size - 1 : idx -1 // etc.
    }
}

_idxネイティブ SQL クエリなしで の値にアクセスできますか?

を試してみましphoto.album.photos.indexOf(photo)たが、一般的には遅延読み込みが必要ですが、読み込みが明らかに遅すぎるためindexOf戻ります。デバッガーのリストの項目はランダムに読み込まれ、以前に単にキャッシュされたものと思われるため、遅延読み込みのせいです。ここで GORM の動作を誤解している可能性があります。-1indexOf

いずれphoto.album.photos.indexOf(photo)にせよ、即時のフィールドアクセスよりも醜く、(おそらく) 遅くなります。理想的には、生成された_idx列と のフィールドの間のマッピングを定義してPhoto、 を使用してアクセスできるようにすることができますphoto.albumIdx

4

1 に答える 1

4

indexColumnを更新可能および挿入可能なマッピングと組み合わせて使用​​すると、コレクション アイテム (写真など) のインデックスを認識させることができます。例えば:

class Album {
    static hasMany = [photos: Photo]
    List photos // Generates column `album_idx` in table for Photo.
    Integer size // Memoized.

    static mapping = {
      photos indexColumn: [name: "position", type: Integer]
    }
}

class Photo {
    Integer position

    static belongsTo = [album: Album]
    static hasOne = [content: PhotoData] // PhotoData has byte[] field for data

    static mapping = {
      position updateable: false, insertable: false
    }
}

photo.positionこの写真のインデックスが表示されます (注: デフォルトでは、リストの順序は 0 ベースです)

于 2013-08-30T18:45:25.503 に答える