【问题标题】:Grails GORM on multiple Forms多个表单上的 Grails GORM
【发布时间】:2011-02-16 23:22:34
【问题描述】:

通常我通过这种方式使用一对多关系:

class Study {
    static hasMany = [ crfs : Crf ]
    String name 
    ...
} 

class Crf { 
String title
String info 
...
} 

我可以将这种关系扩展到其他领域,例如:

static hasMany = [ crfs : Crf, crfb : CrfBlood ...]

但在我的情况下,我必须将 Study 域链接到 30 个其他域,也许更多......(例如:CrfBlood、CrfMedical、crfFamily 等......)。

在我的情况下我应该使用什么域模型实现?
我想在我的项目中保持动态查找器的可用性。

更新 - 模型补充:

研究可以有一对多的主题
研究可以有一对多的Crfs(例如:CrfBlood、CrfMedical、crfFamily 等...)。
一个主题可以有一对多的访问(例如:一个主题可以有多个验血)。

我想将 Crfs 动态分配给一项研究,那么如何在我的域中不使用静态 hasMany = [...] 的情况下使用 GORM(动态查找器)?
也许,我可以实现一个服务来做同样的事情 hasMany 吗?

【问题讨论】:

  • hasMany 中有 30 个域类有什么问题?所有的关系都是1:M(可能blood是1:1的关系)?
  • 我可以拥有一些具有 1:1 关系的 crfs。通常是 1:M。
  • 所以有一些“hasOne”关系:grails.org/doc/latest/ref/Domain%20Classes/hasOne.html。但是.. hasMany 有什么不好?你为什么不直接使用它?
  • 每次我添加一个新的 crf 时,我都必须更新 Study 域。此外,对于每项研究,管理员必须定义他想在研究中使用哪些 crf(例如:Study1 仅使用 CrfBlood 和 CrfMedical,而 Study2 仅使用 CrfMedical 和 CrfFamily)。

标签: grails groovy grails-orm grails-domain-class


【解决方案1】:

您可以将所有 Crf 类型声明为 Crf 的子类,这样您就只能与 Study 建立一种关系,但仍然可以添加不同的类型。

class Crf {
    String title
    String info
}

class CrfBlood extends Crf {
    String detailBlood
}

class CrfMedical extends Crf {
    String detailMedical
}

class Study {
    String name
    static hasMany = [ crfs: Crf ]
}

那么你可以这样做:

def s = new Study(...)
def c1 = new CrfBlood(...)
def c2 = new CrfMedical(...)
s.addToCrfs(c1)
s.addToCrfs(c2)

【讨论】:

  • 哦,我可以使用每个子类的表而不是每个层次结构的表。静态映射 = { tablePerHierarchy false }
猜你喜欢
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多