Я должен реализовать значения карты в своем приложении Grails. У меня есть класс, который может содержать 0.. N OsmTags и ключ уникально. В 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)
}
}
Если ваши теги - простые строки, то вы можете использовать map напрямую.
class Taggable {
Map tags // key : String, value : String
}
Если вы ищете NoSQL решение, вы можете попробовать использовать MongoDB с Grails. Последняя версия (1.4) поддерживает геопространственное индексирование и запросы.