【问题标题】:Grails: groovy subcollectionGrails:常规子集合
【发布时间】:2012-02-04 21:48:20
【问题描述】:

具有以下域类:

class Message{
}

想要获取所有id 多于offset 的消息:

def offset = params.offset
def messages = Message.list()
def subMessages = messages.findAll({offset, it ->
    it.id > offset
}.curry(offset))

怎么了?


更新:我知道Message.list() 可以作为Message.list(params) 执行,但现在不重要了。

【问题讨论】:

  • 您还有问题吗?请标记为已关闭。

标签: grails collections groovy closures currying


【解决方案1】:

使用地图的示例

def params = [offset: 2]
def messages = [[id: 1], [id: 2], [id: 3], [id: 4], [id: 5]]
def subMessages = messages.findAll({ it.id > params.offset })
assert subMessages == [[id: 3], [id: 4], [id: 5]]

使用 Grails 域类进行集成测试

(1..5).each { new Message(text: "${it}").save(failOnError: true) }
def params = [offset: "2"]
def offset = Integer.parseInt(params.offset)
def messages = Message.list()
def subMessages = messages.findAll({ it.id > offset })
assert subMessages == Message.findAllByIdGreaterThan(offset)

【讨论】:

  • 对不起,我的错。您的示例适用于地图,但不适用于域类。
  • @tiktak 实际上它也适用于 Grails 域类 list
  • 这很奇怪。为它创建了一个问题:jira.grails.org/browse/GRAILS-8730 感谢您的帮助。
  • 正确的方法是在数据库中进行过滤,正如这个答案所描述的 - 拉回每个实例并在客户端过滤可能非常昂贵。我已经在 J​​IRA 中解释了为什么你的方法不起作用。
  • 更新了我的答案以处理字符串到 int 的转换。
猜你喜欢
  • 1970-01-01
  • 2018-11-27
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多