GORM:设置枚举值的排序

时间:2014-09-27 16:23:51

标签: grails enums gorm

鉴于以下内容

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

我希望'state'属性能够持久化,以便:

  • 可读值存储在DB(I.E而不是序数,但字符串)
  • 值的顺序与隐含的字典顺序不同(因此SQL的ORDER BY将以所需的方式对它们进行排序)

如何实现这一目标?

由于

1 个答案:

答案 0 :(得分:2)

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

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

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.
}

然后,我通常会将代码放入我的灯具中,以便在需要测试时创建菜单选项等。

这比enum的好处是能够使用管理型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时,您可以选择包含可能值的列表,并将select的名称设置为“selectedValue.id”,Grails将在数据绑定期间自动填充SomeObject中的selectedValue字段。对所选MenuValue的引用。

希望这是有帮助的