这是this问题的延续。
我有一个Address
课程,其中包含基本的街道地址信息。我还有一个User
类,其中包含physicalAddress
,mailingAddress
,cargoDestinations
和cargoSources
属性。 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
变量的映射方式有关。如何在不更改类文件的情况下修复此问题?
答案 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
类中的一个用户相关联,但似乎不会出现问题。最糟糕的情况是多个用户在现实生活中会有相同的地址,而我的程序需要为每个用户创建一个单独的地址对象,即使有问题的地址是相同的。