我进入Grails开发已经有两个月了,偶然发现了这个挑战,我找不到使用书籍,grails网站和论坛搜索的答案。我希望有人可以帮助我。
我有2个域类 - AccountPackage和AccountPackageFeatures。这个想法是AccountPackage(例如黄金账户)可以有许多功能。为了表示这一点,AccountPackage域具有AccountPackageFeatures的嵌入列表。以下是两个域类:
class AccountPackage {
String name // eg. Gold Account
boolean active // eg. true - account is active
List features = []
static hasMany = [features:AccountPackageFeature]
static constraints = { }
}
class AccountPackageFeature {
String featureName // eg. "Number of posts allowed"
String featureCategory // eg. "Job Posting"
String value // eg. "10"
static constraints = { }
}
数据已保存在数据库中。在我的代码中,我检索了一个特定的AccountPackage实例,现在我想查找该AccountPackage的特定功能。我这样做的方法是从AccountPackage实例获取功能列表,然后遍历列表,直到找到我感兴趣的相应功能。下面的代码片段:
def desiredFeature = null
def desiredFeatureId = 10
AccountPackage pkg = AccountPackage.findByName("Gold Account")
def features = pkg.getFeatures()
for (feature in features) {
if (feature.id == desiredFeatureId) {
desiredFeature = feature
}
}
我知道这是非常低效的......但是在Grails中这样做的权利是什么?
grails / GORM是否提供任何内置功能以免我进行自定义查询?或者,我应该为我的AccountPackage域对象添加一个名为getFeatureWithId的自定义方法,该方法获取一个ID,然后执行自定义查询以返回所需的功能?
任何关于最佳实践/正确方法的建议都将非常感激。
答案 0 :(得分:3)
试试这个
AccountPackage.findByNameAndFeature("Gold Account",AccountPackageFeature.findById(desiredFeatureId))
或
AccountPackageFeature.findByIdAndAccountPackage(desiredFeatureId,AccountPackage.findByName("Gold Account"))
答案 1 :(得分:2)
为什么你说你的搜索片段效率低下? 它的复杂性是线性的,因此,在实践中,其效率取决于帐户包可以具有的功能的数量。如果该金额大约为十分之一,那么您不应该费心优化任何事情。
根据经验,“早期优化是万恶之源”。我建议您实施您的解决方案并在实际使用情况下测试其性能,以确定其效率低下是否会损害您的应用程序的性能。
现在关于你的代码片段,你可以利用Groovy语言的一些很酷的功能,我会改写它:
def getFeatureById(desiredFeatureId) {
def pkg = AccountPackage.findByName("Gold Account")
pkg.features.find { feature -> feature.id == desiredFeatureId }
}
您可以在Groovy网站上了解Collections和Closures
答案 2 :(得分:0)
您可以在第二个域而不是循环
上使用动态查找器 AccountPackage pkg = AccountPackage.findByName("Gold Account")
def desiredFeature = pkg ? AccountPackageFeature.findByAccountPackage(pkg) : []
查看click here并查找查询关联以获取更多信息