Ruby on Rails - 访问当前用户的嵌套属性

问题描述 投票:0回答:1

我试图访问rails部分中的一些嵌套属性;让我解释一下我的问题:

我根据我在另一个问题中提到的dana mulder教程写了一个简单的消息服务。一个user has_many conversations,和一个conversation has_many messages。每个对话都有一个收件人和一个发件人,每条消息都有一个布尔值read,默认设置为false

我想要做的是写一个简单的函数,迭代用户在他参与的对话中得到的每条消息,检查用户在对话中收到的最后一条消息是否为read == true而不是由他自己发送给在我的应用导航中的“消息”链接旁边显示一个小旋钮。

我基本上想要检查的是(多行以获得更好的可读性):

<%= if current_user.conversations.all.messages.last.user_id != current_user.id && current_user.conversations.all.messages.last.read == false %>

    Message link with bubble beside it

<% else %>

    Message link

<% end %>

这种语法不起作用。如何迭代用户所涉及的每个对话,检查每个对话的最后一条消息,如果它是由该用户写的,如果已经读过则不是?

虽然像Conversation.last.messages.last.content这样的东西正在工作,current_user.conversations.all.messages.last.content却没有......我觉得有点混淆轨道模型的可访问性如何工作。

提前致谢!我希望我能够很好地解释我。

最好的祝福

ruby-on-rails ruby model nested-attributes
1个回答
1
投票

你想和current_user.conversations.all.messages.last.content做什么?因为conversations.all是一个关联,它不是一个对话,所以messages不是一个可用的方法。 Conversation.last是一个对话,这就是为什么你可以打电话给messages

您可以尝试current_user.conversations.last.messages.last.content获取上次会话的最后一条消息,或者,您可以在User上使用“has_many:through”关系

class User ...
  has_many :conversations
  has_many :messages, through: :conversations
end

这样你可以做current_user.messages如果你想要所有用户的消息和current_user.messages.last获取最后一条消息(即使它不是来自最后一个对话)。

我建议你阅读关于协会https://guides.rubyonrails.org/association_basics.html#the-has-many-through-association的Rails指南

编辑:要知道用户是否有一些未读消息,您可以使用has_many :through关联并执行类似的操作

current_user.messages.where(read: false).where.not(user_id: current_user.id).any?

这将返回true来自用户与id!= current_user.id的对话的任何消息都不会被读取。而false否则。

如果你不知道未读消息的实际数量,你可以使用count而不是any?

© www.soinside.com 2019 - 2024. All rights reserved.