在Grails中建模地图值的最佳方法?

时间:2010-05-17 14:38:40

标签: grails groovy map

我必须在Grails应用中实现地图值。 我有一个可以包含0..N OsmTags的类,键是唯一的。 在Java中,我会在每个对象中使用Map对其进行建模,但我不知道如何在Grails中映射类。

所以我定义了这个类:

class OsmTag {
    /** OSM tag name, e.g. natural */ 
    String key
    /** OSM tag value, e.g. park */
    String value

    static constraints = {
        key blank:false,    size:2..80,matches:/[\S]+/, unique:false
        value blank:false,  size:1..250,matches:/[\S]+/, unique:false
    }
}

这样可行,但它实际上非常难看,因为标记键不是唯一的。 有没有更好的方法来模拟这个问题?

干杯

3 个答案:

答案 0 :(得分:2)

如果您的代码是简单的字符串,那么您可以使用map directly

class Taggable {
    Map tags // key : String, value : String
}

答案 1 :(得分:0)

如果我理解你的问题,那么你想确保每个标签在标记实体的特定实例中是唯一的吗?

假设标签所附加的实体名为Taggable,然后 您可以使用自定义约束来强制执行此要求:

class Taggable {
    static hasMany = [ tags: OsmTag ]
}

class OsmTag {

    static belongsTo = [ taggable: Taggable ]

    /** OSM tag name, e.g. natural */ 
    String key
    /** OSM tag value, e.g. park */
    String value

    static constraints = {
        key(blank:false,    size:2..80,matches:/[\S]+/, unique:false, 
            validator: { val, obj ->
                if (obj.taggable.tags.key.count(val > 1)) {
                    return false 
                }
            }
        )

        value(blank:false,  size:1..250,matches:/[\S]+/, unique:false)
    }
}

答案 2 :(得分:0)

如果您正在寻找NoSQL解决方案,可以尝试使用MongoDB with Grails。最新版本(1.4)支持Geospatial indexing and querying