【问题标题】:add user define properties to a domain class将用户定义属性添加到域类
【发布时间】:2010-08-01 15:08:11
【问题描述】:

我需要允许用户在其中一个系统实体中定义一些自定义字段。你有什么建议/模式/插件可以帮助我将此功能添加到我的应用程序中。

谢谢,

男人

【问题讨论】:

    标签: grails grails-domain-class


    【解决方案1】:

    您可以将 Map 属性添加到您的域类并在那里存储任意数据。不过还是比较有限的。它将生成一个包含 varchar(255) 键和值的表,因此您需要自己管理任何类型转换,例如

    class Thing {
       String name
       Map extraProperties = [:]
    }
    
    int age = 123
    def thing = new Thing(name: 'whatever')
    thing.extraProperties.age = age.toString()
    thing.save()
    
    ...
    
    def thing = Thing.get(thingId)
    int age = thing.extraProperties.age.toInteger()
    

    有关简短的在线文档,请参阅http://grails.org/doc/latest/ 的“5.2.4 集合、列表和地图”部分。

    【讨论】:

    • 那里没有类型安全或抽象。
    • 所以如果我想动态地进行 - 我可能需要额外的映射来存储类型或在映射中放入一个具有描述类型属性的类:Class extraProp { int typeCode String价值 }
    • @duffymo 要求中没有提到类型安全和抽象。
    • 作为 Burt 方法的替代方案,但本意相同,请参阅 stackoverflow.com/questions/3237393/…
    • @Matt Lachman - 在“要求”中几乎没有提到珍贵的东西。只是一个兴趣点,仅此而已。
    【解决方案2】:

    听起来您希望您的应用程序成为用户可以随意修改的无限可调扳手。这公平吗?

    我认为这是不可能的或不可取的。想一想当您在 Grails 中向现有域对象添加属性时会发生什么。该属性被添加到 ORM 映射中,这意味着必须修改表。 UI 添加了另一个文本框用于数据输入;列表页的表格中添加了另一列。

    添加属性时会发生很多事情。您将如何管理同时修改应用程序的多个用户?当一个用户正在修改表而另一个用户正在访问旧版本时会发生什么?

    你问的太多了。我不认为这是一个合理的要求。 Grails 的最佳点是基于 Web 的 CRUD 应用程序的快速开发。我认为这不包括用户在运行时进行的修改。

    【讨论】:

    • 这个要求存在并在许多系统中实现。所以我不认为我要求太多。也许实现很复杂,但它是可行的——几年前我在 JEE 应用程序中做过,我很乐意从在 Grails 中做过的开发人员那里获得帮助和想法。
    • 同意发帖者,虽然它在技术上是可行的 Grails 是错误的技术。您可以在汇编中编写 stackoverflow.com,但考虑到所涉及的所有额外工作,这将不是一个好方法。
    • 这就是计划如何通过在 2.5 岁的答案上制作无用的 cmets 来建立你的小代表 Thermech 吗?让我们看看你提供更好的东西。
    • 自定义字段不是无限可调的扳手,也不是不合理的要求。例如,许多 ORM 都有它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    相关资源
    最近更新 更多