2010-05-17 4 views
1

Мне нужно реализовать значения карты в приложении Grails. У меня есть класс, который может содержать 0..N OsmTags, а ключ уникален. В Java я бы моделировал это с помощью карты в каждом объекте, но я не знаю, как сопоставлять классы в Grails.Лучший способ моделирования значений карты в 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 
    } 
} 

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

Приветствия

ответ

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) 
    } 
} 
+0

да, это намного лучше! Спасибо – Mulone

2

Если теги простые строки, то вы можете использовать map directly ,

class Taggable { 
    Map tags // key : String, value : String 
} 
Смежные вопросы