Лучший способ смоделировать значения карты в Grails? - PullRequest
1 голос
/ 17 мая 2010

Я должен реализовать значения карты в моем приложении 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 ]

2 голосов
/ 17 мая 2010

Если ваши теги представляют собой простые строки, то вы можете использовать карту напрямую .

class Taggable {
    Map tags // key : String, value : String
}
0 голосов
/ 18 мая 2010

Если вы ищете решение NoSQL, вы можете попробовать использовать MongoDB с Grails . Самая последняя версия (1.4) поддерживает геопространственную индексацию и запросы .

0 голосов
/ 17 мая 2010

Если я правильно понимаю ваш вопрос, то вы хотите убедиться, что каждый тег уникален в конкретном экземпляре помеченного объекта?

Предположим, что объект, к которому прикреплены теги, называется 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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...