2011-04-29 18 views
2

鉴于这种关系:保存新记录时动态发现关系的更好方法? (阿瑟赛德失败)

class A { 
    String name 
    static hasMany = [b:B] 
} 
class B { 
    String name 
    static belongsTo = [a:A] 
} 

我有我想要保存的记录b。我通过工作Grails的反射(在下面的代码示例略),它必须是B类除此之外的实例已经发现,记录b只知道:

  • 它有关系“一“
  • 关系 ”一“ 的关键

因为它是一个动态的情况下,我们不知道的,必须发现:

  • 关系“一”是A类(所以我们可以称之为一个 .find(一个重点))
  • 关系的“另一边”的一个实例 - A级的角度来看 - 是关于“b“(这样我们就可以称之为.addToB(b))

那么如何I b保存到数据库?以下是我的工作方式:

class AssocTests extends GrailsUnitTestCase { 
    protected void setUp() { 
     super.setUp() 
     // I don't know this part, but it's in the DB 
     def a = new A(name:"al") 
     a.save() 
    } 

    void testAssociation() { 
     // I want to create a new B such that name="bob" 
     // I also had to discover "class B" using (working) Grails reflection 
     // but omitted it for this example. 
     def b = new B(name:"bob") 
     // ... and the relation is as "given" below 
     def given = [a:[name:"al"]] 
     // So I need to call A.find([name:"al"]).addToB(b). But "A" and 
     // "addToB" are unknown so need to be found via reflection 
     def gdc = new DefaultGrailsDomainClass(B) 
     given.each { give -> 
      def prop = gdc.getPropertyByName(give.key) 
      if (prop.isAssociation() && !prop.isOwningSide()) { 
       println "I want to use otherSide, but it's ${prop.otherSide}" 
       def os = reallyGetOtherSide(B, give) 
       def object = os.parent.find(
         os.parent.newInstance(give.value)) 
       object."${os.method}"(b) 
      }  
     }  
     def bFound = B.findByName("bob") 
     assertEquals "al", bFound.a.name 
    } 

    def reallyGetOtherSide(clazz, relation) { 
     def parent=clazz.belongsTo[relation.key] 
     def addTo=parent.hasMany.find { (clazz == it.value) }.key 
     [parent:parent, method:"addTo${addTo.capitalize()}"] 
    } 
} 

... with otherSide不幸的是返回null。这不可能是做到这一点的最佳方式,可以吗?

回答

0

如果我理解正确,可以参考这些文档here。你可以试试以下内容:

`new A(name:"Gatwick") 
     .addToB(new B(name:"BA3430")) 
     .addToB(new B(name:"EZ0938")) 
     .save()` 
+1

我觉得有一个误区。这是一个动态的例子,我不知道“A.addToB”,并且必须通过反思来发现它。另外,我并没有创建一个新的A.想象一下,为了简洁,我还省略了其他一些类和关系。不过谢谢你的回应。 – 2011-04-29 12:51:48