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

时间:2018-09-18 16:30:11

标签: ruby-on-rails ruby model nested-attributes

我正在尝试访问Rails部分中的一些嵌套属性;让我解释一下我的问题:

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

我要做的是编写一个简单的函数,该函数遍历用户所涉及的对话中的每条消息,并检查是否已读取用户在对话中收到的最后一条消息== 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不是。我发现Rails模型的可访问性如何工作有点混乱。

先谢谢!我希望我对我的解释足够好。

最好的问候

1 个答案:

答案 0 :(得分: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?