Grails select不会返回正确的数据

时间:2011-08-08 16:04:56

标签: grails groovy gorm

这是this问题的延续。

我有一个Address课程,其中包含基本的街道地址信息。我还有一个User类,其中包含physicalAddressmailingAddresscargoDestinationscargoSources属性。 User类看起来像这样:

class User {

    String username
    String password
    String firstName
    String lastName
    String businessName
    String phoneNumber
    Address physicalAddress
    Address mailingAddress
    static hasMany = [accounts:Account, cargoSources:Address, cargoDestinations:Address, cargoes:Cargo, loadsLogged:Load, loadsDelivered:Load]
    Set accounts, cargoSources, cargoDestinations, cargoes
    static mappedBy = [loadsLogged:"loggedBy", loadsDelivered:"deliveredBy"]

//some other stuff after this

Address类看起来像这样:

    class Address {

        static belongsTo = [user:User]

        String streetAddress
        String city
        String state
        String zip

        BigDecimal taxRate

//some other stuff after this

我在大多数情况下都遵循了教程here。在第5步中,我的模板如下所示:

<g:select
  from="${account.user.cargoDestinations}"
  name="cargoDestinations" value="">
</g:select>

问题是,模板不返回cargoDestinations,而是返回与该用户关联的所有地址。如果我将from="${account.user.cargoDestinations}"更改为from="${account.user.physicalAddress}"from="${account.user.mailingAddress}",我会得到预期结果,因此我知道我的问题与cargoDestinations变量的映射方式有关。如何在不更改类文件的情况下修复此问题?

2 个答案:

答案 0 :(得分:1)

映射地址的方式,它们都链接回user_id列上的用户。您需要向Address添加一些字段以区分它们与User的关联方式,类似于您映射Loads的方式。例如:

class Address {
    static belongsTo = [cargoSourceFor: User, cargoDestinationFor: User]

    ...
}

class User {

    ...

    static hasMany = [cargoSources:Address, cargoDestinations:Address]
    static mappedBy = [cargoSources: "cargoSourceFor", cargoDestinations: "cargoDestinationFor"]

    ...
}

如果您熟悉SQL,在设置映射时执行grails schema-export并查看target/ddl.sql会很有帮助。

答案 1 :(得分:0)

我最终在我的地址类中添加了几个布尔字段,这使得设计更简单,更容易使用。这样我只需要一个类而不是几个几乎相同的类。 Address类中的布尔字段现在指示地址是物理地址,邮寄地址,货物来源等,还是以上所有内容。正如@ataylor指出的那样,这个系统使得地址对象只能与我的User类中的一个用户相关联,但似乎不会出现问题。最糟糕的情况是多个用户在现实生活中会有相同的地址,而我的程序需要为每个用户创建一个单独的地址对象,即使有问题的地址是相同的。