在我们的应用程序中,我们有一个可以有游戏和练习计划的玩家,因此我们设计了抽象类计划和两个派生类GamePlan和PracticePlan。在数据库中,派生类被保存到具有“class”属性的单个表中。
当我们在特定玩家上使用getPlans()时,我们会获得所有计划,但我们想知道如何只获得游戏或练习计划。像player.getPracticePlans()或Player.PracticePlans(player_id)之类的东西。以下是我们的课程。
class Player {
String name
static hasMany = [ plans : Plan]
}
abstract class Plan {
}
class PracticePlan extends Plan{
}
class GamePlan extends Plan{
}
注意:我们尝试使用类似:
def query = Player.where {
plans { class == "GamePlan" }
}
但是这个类是一个保留的关键字,它不能编译。
答案 0 :(得分:1)
我相信你可以这样做来加载一个Person的所有计划,然后过滤掉不需要的计划:
def gamePlansForPlayer = Player.get( id ).plans.findAll { plan ->
plan.instanceOf( GamePlan )
}
虽然没有测试过: - (
答案 1 :(得分:0)
您应该可以使用def plans = Player.withCriteria {
plans {
eq('class', "com.name.space.GamePlan")
}
}
获得课程。请参阅此答案:Groovy / grails how to determine a data type?。
您还可以使用Criteria,这会将列添加到引号中,因此它不会遇到保留字问题:
def namedQueries = {
plansByClass = { clazz ->
plans {
eq('class', clazz)
}
}
}
(请注意,我指定了带有命名空间的类名,因为它是如何根据我的经验存储的.YMMV。)
如果这样做并且您想使其更通用,您可以将其变为named query并将该类作为参数提供:
def plans = Player.plansByClass('GamePlan')
然后将其称为静态方法:
$('#tabId a[href="#s' + targetId + '"]').click(function (e) {
e.preventDefault();
});
请注意,虽然我在我的应用程序中使用Criteria,但这些特定示例未经过测试。