gpt4 book ai didi

groovy - 引用 Grails GORM 中的引用表的域对象

转载 作者:行者123 更新时间:2023-12-02 13:50:10 26 4
gpt4 key购买 nike

我有一个名为 User 的域对象:

class User{
String username;
String firstName;
String lastName;
Zipcode zip;
}

我还有一个邮政编码对象:
class Zipcode {
String zip;
String city;
String state;
Float lat;
Float long;
}

邮政编码表不应被修改,因为它包含预先填充的静态引用数据

一个用户属于一个邮政编码。用户输入邮政编码作为用户创建的一部分。

我应该如何建模域对象关系?我想确保 GORM 不会尝试更新邮政编码。我想确保用户只输入有效的邮政编码。 (可在邮政编码表中找到)如何配置用户对象的约束?在 Controller 中,我执行以下操作:
def userInstance = new User(params) // where params are form values

如何在对象上设置正确的邮政编码?

最佳答案

你不会让 GORM 管理 zip属性(property)(并在第二阶段限制 GORM 这样做)。

这也是 mfloryan 的方法所说明的。然而,他的方法并没有正确地分离关注点(关注点分离范式):在 MVC(模型- View - Controller )模式中,“建模”数据模型不是 Controller 的任务,而是数据访问层(在 GORM 的情况下是域类本身)。

因此,User类将像这样实现:

class User {
String userName
String firstName
String lastName
String zip

ZipCode retrieveZipCode() {
ZipCode.findByZip(zip)
}

static constraints = {
zip nullable: false, blank: false, matches: /^\d{5}/,
/* not tested at my machine: */
validator: {
if(!retrieveZipCode(it)) {
return false
}
}
}
}

注意 retrieveZipCode()方法。它不叫 getZipCode()因为,否则,Hibernate 会抛出关于“缺少 setter 方法”的异常。您也可以尝试添加 zipCode属性(property),一个 getZipCode()方法(什么都不做,或者抛出异常),并添加 zipCode transinients 的属性(property)定义。 - 这一切(任何组合)都不起作用。

另请注意 constraints定义: zip 时匹配正好由五个数字组成。 (我相信这是美国邮政编码的格式。)
它还应确保数据库包含用户邮政编码的条目(未测试语法)。

我已更改 ZipCode稍微分类(部分是为了避免编译错误):
class ZipCode {
String zip;
String city;
String state;
Float latitude;
Float longitude;
}

最后,有一个集成测试:
class UserTests extends GroovyTestCase {
def testUserCreation() {
User user = new User(
userName: "foo", firstName: "bar",
lastName: "baz", zip: "12345")
assert user.validate()
assert user.retrieveZipCode()
user.save()
}
}

谢谢

关于groovy - 引用 Grails GORM 中的引用表的域对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4009558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com