【问题标题】:getting an object by id in a GSP file在 GSP 文件中通过 id 获取对象
【发布时间】:2013-03-10 09:59:48
【问题描述】:

我的域模型的一部分有Conversation,其中有很多ChatMessages

在我的 index.gsp 中,我有以下内容:

<g:each in="${allConversations}" var="conversation">
        ${conversation.chatMessages}
    </g:each>

显示特定用户的所有对话,将聊天消息输出为

[hi, how are you][another convo, hi again]

这是正确的结果。但我只想得到每个对话的第一条消息。我试过了

${conversation.chatMessages[0]}

${conversation.chatMessages.get(0)}

但无济于事。正确的语法是什么?

【问题讨论】:

  • 您的Conversation 类的chatMessages 属性是否声明为列表?如果是这样,那么任何一种形式都应该可以工作,但如果它只是一个 hasMany 没有明确的 List 声明,那么它就是一个 Set,你不能按数字索引。
  • 是的,它是 hasMany 的一部分,因为我在将数组列表持久保存到数据库时遇到问题,谢谢

标签: grails gsp


【解决方案1】:

如果您希望能够通过 index 引用对话中的单个消息,那么您需要将关联声明为列表:

class Conversation {
  static hasMany = [chatMessages: ChatMessage]

  List chatMessages

  // constraints, mapping, other properties...
}

如果您只有hasMany 而没有List chatMessages,则关联将被映射为Set 而不是List,这样您就可以迭代但不能通过索引访问。

请参阅 grails 文档中的 sets, lists and maps 了解完整详情。

【讨论】:

  • 谢谢,我现在明白了。我的域模型在使用它时会产生一个数据库错误,但是由于我这边的架构不好,但我会继续让它工作。与此同时,我在我的 GSP 文件中使用${conversation.chatMessages.toArray[0]},直到我让它正常工作。感谢您的解决方案
  • @andymccullough 将关联映射为 List 需要相关数据库表中的额外非空列(用于存储每个条目的索引号),因此您可能必须删除并重新创建您的数据库(或制定 SQL 以将新列添加为可为空,填写正确的值,然后将其切换为非空...)。像现在这样使用默认的Set 关联的问题在于它没有任何内在顺序,即您作为[0] 发出的消息在每次调用时不一定总是相同的。
猜你喜欢
  • 2012-06-30
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多