Grails - 自动向所有域对象添加自定义字段(列)

时间:2011-08-08 14:55:56

标签: grails grails-domain-class

默认情况下,在创建域类时,它会自动为所有域类(表)添加“id”和“version”列。如果我想添加一个列,例如,例如,该怎么办? “isChecked”,这应该自动添加到所有域类(即表),类似于添加“id”和“version”列。如何实现这一点,如果我不想为特定的域类提供“isChecked”,我也应该能够做到这一点。

如何在Grail 1.3.7中执行此操作?

谢谢。 杰伊·钱德兰

编辑:我可以获得更多输入吗?建议的答案没有用!

3 个答案:

答案 0 :(得分:3)

你可以使用Groovy为这类东西提供的元编程魔法,但是,我可能只是去一个更典型的路径并使用继承。创建一个包含isChecked(以及您需要的任何其他内容)的父域,并让您的域需要它们扩展该类。

答案 1 :(得分:0)

我建议创建一个修改(添加属性)域工件的插件。您可以阅读有关plugins and artifacts的更多信息。然后,您可以轻松添加静态属性(例如,静态nochecked = true),以过滤掉您不希望根据需要添加新属性的域工件。

答案 2 :(得分:-1)

您可以使用元编程来完成此操作。添加属性的代码应该在插件的doWithDynamicMethods闭包中运行,或者从Bootstrap.groovy运行。如果使用插件方法,这样的事情应该有效:

def doWithDynamicMethods = {ctx ->
  application.domainClasses
        .findAll {it.simpleName.startsWith('S')}.metaClass.each {domainMetaClass ->

    Integer fooVal = 0

    domainMetaClass.getFoo = {-> fooVal}
    domainMetaClass.setFoo = {Integer newFooVal -> fooVal = newFooVal}
  }
}

上面的代码应该为名称以“S”开头的每个域类添加Integer foo属性。我没有测试过这段代码,所以它可能不起作用。要查看一个您可以更自信的示例:

  1. 找一个添加修改域类的插件(例如添加字段或方法)
  2. 下载
  3. 查看插件描述符的doWithDynamicMethods闭包
  4. 中的代码
  5. 复制,粘贴并适应您的需求