Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Grails中建模贴图值的最佳方法?_Grails_Groovy_Map - Fatal编程技术网

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

在Grails中建模贴图值的最佳方法?,grails,groovy,map,Grails,Groovy,Map,我必须在Grails应用程序中实现映射值。 我有一个可以包含0..N个OSMTag的类,并且密钥是唯一的。 在Java中,我会用每个对象中的映射来建模,但我不知道如何在Grails中映射类 所以我定义了这个类: class OsmTag { /** OSM tag name, e.g. natural */ String key /** OSM tag value, e.g. park */ String value static constraint

我必须在Grails应用程序中实现映射值。 我有一个可以包含0..N个OSMTag的类,并且密钥是唯一的。 在Java中,我会用每个对象中的映射来建模,但我不知道如何在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
    }
}
这很好,但实际上很难看,因为标记键不是唯一的。 有没有更好的方法来模拟这个问题


干杯

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

假设标记所附着的实体名为
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)
    }
}

如果标记是简单字符串,则可以使用


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

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