【发布时间】:2017-02-25 08:35:08
【问题描述】:
我有两张桌子:
- 一个会话表,其中包含一个会话列表及其 ID(以及与每个会话关联的两个用户 ID('recipient_id' 和 'sender_id')。
- 包含与现有对话之一相关的消息的消息表。每个 Message 实例都包含一个布尔属性“read”(默认为 false),用于显示对话中是否有任何未读消息。
所以 Conversation has_many :messages 和 Message belongs_to :conversation
我的目标是检查 current_user 是否有任何未读消息(在他现有的任何对话中)以显示一般警报。 到目前为止,我已经设法为每个对话显示一个警报,但我正在努力寻找一种有效的方法来实现一个通用的。
我最初的方法是:
- 在每个当前用户的对话中查找最后一条消息。
- 评估最后的每条消息是否都是由当前用户发送的,如果 read == false。
- 如果最后一条消息满足这些条件,则返回 true。
这翻译成如下代码:
@conversations = current_user.conversations
@unread = []
if @conversations.exists?
@conversations.each do |conversation|
if conversation.messages.exists?
if conversation.messages.last.user_id != current_user.id && conversation.messages.last.read == false
@unread << true
end
end
end
end
@unread.include?(true)
end
我是一个相当新的编码,但它似乎是一种非常低效的方法,必须遍历所有 current_users 对话并创建一个数组来检查它是否有任何“真实”值。
我会自己遍历消息,但一个实例只有发件人的 user_id,所以如果我不将它与对话模型链接,则无法知道是否有消息发送给他。
您能否通过更合适的 Active Record 查询或更好的方法来提供一种有效的方法来实现此目的。
顺便说一句,不确定是否重要,但我在开发环境中使用的是 postgresql。
谢谢
【问题讨论】:
标签: ruby-on-rails postgresql activerecord