2014-09-27 82 views
1

鉴于以下GORM:上枚举设定的排序值

class MyDomain { 
    enum State { 
    PRIMORDIAL, 
    INITIAL, 
    EXTENDED, 
    TERMINAL 
    } 
    State state 
} 

我想要“状态”属性被保留,使得:

  • 可读值被存储在DB(IE不序,但字符串)
  • 值的顺序比隐含的字典顺序不同(使SQL的ORDER BY会以希望的方式对它们进行排序)

这是如何实现的?

谢谢

+0

很确定答案是......不是很容易。枚举当前只在数据库中存储1个值,所以如果您想要DB中的字符串,那么这是唯一需要发出ORDER BY的数据。这就是说......一旦你将数据加载到Gorm域对象中,你就可以对它进行排序,但是这不会让你的分页正确(如果你需要的话)。你可以创建你自己的枚举类来包含一个命令和一个字符串,并将它映射到表中的两个字段,然后根据需要按顺序排序。 – billjamesdev 2014-09-28 03:08:53

+0

谢谢。确切地说 - 我的目标是保持分页。正在考虑命令/字符串字段对,但希望有一个开箱即用的解决方案,因为这似乎是一个常见的用例。 – pointyhat 2014-09-28 06:34:36

+0

您也可以查看org.codehaus.groovy.grails.orm.hibernate.cfg.IdentityEnumType,因为我听说它在改变枚举所存储的内容方面有一定用处。 – billjamesdev 2014-09-29 00:09:55

回答

2

很确定答案是......不是很容易。枚举当前只在数据库中存储1个值,所以如果您想要DB中的字符串,那么这是唯一需要发出ORDER BY的数据。这就是说......一旦你将数据加载到Gorm域对象中,你就可以对它进行排序,但是这不会让你的分页正确(如果你需要的话)。

您可以创建自己的枚举类来包含一个订单和一个字符串,并将其映射到表中的两个字段,然后根据需要按顺序排序。我用我称之为“可能的价值”或“菜单价值”做了很多工作;是这样的:

class MenuValue { 
    String text 
    String description // used for mouseover, or some such 
    int sort_order 
    String group // used to retrieve all values for a menu/pulldown, etc. 
} 

然后我通常把代码放在我的比赛时间超过枚举的需要时通过试验建立的菜单选项等

这样做的好处是改变菜单的内容的能力/使用管理员型crud屏幕即时选择。你仍然可以“循环”在他们喜欢通过枚举类型的:

MenuValue.findAllByGroup("groupname").sort { it.sort_order }.each { it -> iteration code } 

所以,如果你有一个类如果有人不得不从菜单中选择,你可以这样做:

class SomeObject { 
    String something 
    MenuValue selectedValue 
} 

而且你可以检索所有SomeObjects,由MenuValue的像sort_value分类:

params.sort = "selectedValue.sort_order" 
params.order = "asc" 
SomeObject.findAllBySomethingLike(search_term, params) 

和你SomeObject的编辑过程中,你可以有可能值的列表中选择,并有选择的名字是“selectedValue.id”,Grails将在数据绑定期间自动填充SomeObject中的selectedValue字段并引用所选的MenuValue。

希望这会有帮助