【问题标题】:Grails select will not return correct dataGrails select 不会返回正确的数据
【发布时间】:2011-08-08 16:04:56
【问题描述】:

这是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 变量的映射方式有关。如何在不过多更改类文件的情况下解决此问题?

【问题讨论】:

  • 几个问题:1) UserAddress 关系是双向的吗? 2) 如果是这样,您的User 域上是否有mappedBy? ...不确定是否会导致这种情况,但值得一看。
  • @Rob 我更新了我的问题,提供了有关我的课程的更多详细信息。

标签: grails groovy grails-orm


【解决方案1】:

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

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 可能会有所帮助。

【讨论】:

  • 谢谢,我会试一试,我没有意识到一个对象可以belongTo 比另一个对象更多。我确实使用 RazorSQL 连接到 Grails 数据库文件只是为了查看表是如何设置的,但我也会尝试schema-export
  • 让我问你这个问题,我如何解决我的用户也有一个(并且只有一个)physicalAddress 和一个(并且只有一个)mailingAddress 的事实?是否需要以相同的方式进行映射?
  • 不,区别在于数据库如何表示关系。当您有一个用户到多个地址时,如cargoDestinationscargoSources,用户ID 存储在地址表中。当您将一个地址发送给(可能)多个用户时,例如在physicalAddressmailingAddress 中,地址ID 存储在用户表中。
  • 我仍然无法正常工作,经过深思熟虑后,我认为在我的地址类中添加几个布尔字段可能会更好,指示地址是否为物理地址,邮寄地址、货物来源、货物目的地或四者的任意组合。这样一个用户有很多地址,一个地址属于一个用户:用户。您认为这种方法有什么潜在的问题或缺点吗?
  • 这种方法听起来更简单。它确实将每个地址对象限制为仅与一个用户关联。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 2014-12-25
    • 2019-11-22
    • 1970-01-01
    • 2014-10-11
    • 2016-07-15
    相关资源
    最近更新 更多