我的应用程序具有与相册和单张照片具有相同逻辑关系的域类。为 hasMany 关联使用 List 应该支持在单个相册内向后和向前移动,而无需显式管理位置字段或上一个/下一个指针。

例如:

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. 
    } 
} 

我可以在没有 native SQL 查询的情况下访问 _idx 的值吗?

我试过 photo.album.photos.indexOf(photo),但是 indexOf 返回 -1 因为加载显然太对于 indexOf 来说是懒惰的,虽然一般来说我确实想要延迟加载。我责怪延迟加载,因为在调试器列表中项目是随机填充的,我怀疑那些只是以前缓存的。我可能误解了 GORM 在这里的行为。

在任何情况下,photo.album.photos.indexOf(photo) 都比直接字段访问更难看并且(可能)更慢。理想情况下,我可以在生成的 _idx 列和 Photo 中的字段之间定义一个映射,以允许使用 photo.albumIdx 进行访问。

请您参考如下方法:

使用 indexColumn结合updateableinsertable映射,您可以让集合项(例如您的照片)索引感知。例如:

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 的)


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!