【问题标题】:Ruby on Rails - accessing nested attributes of current userRuby on Rails - 访问当前用户的嵌套属性
【发布时间】:2018-09-18 16:30:11
【问题描述】:

我正在尝试访问 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 模型的可访问性如何工作有点令人困惑。

提前致谢!我希望我解释得足够好。

最好的问候

【问题讨论】:

  • 每个对话是否有单独的消息链接?还是只针对所有对话?
  • 我猜你需要遍历每个对话。 “conversations.all.messages”将不起作用,因为“conversations.all”将返回一个活动的关系对象。 (附带说明,如果有很多对话,应避免使用“all”。它会将所有对话加载到内存中,导致内存使用率高)

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


【解决方案1】:

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

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

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

如果您希望所有用户的消息和current_user.messages.last 获取最后一条消息(即使它不是来自最后一次对话),那么您可以使用current_user.messages

我建议你阅读 Rails Guide about Associations https://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

编辑:要知道用户是否有未读消息,您可以使用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?

【讨论】:

  • 我认为这不符合 OP 的意图。如果会话 1 的最后一条消息来自其他人且未读,但会话 2 的最后一条消息来自他自己,那么他不会知道有一个会话他没有看到最新消息。
  • @SteveTurczyn,这就是为什么我问他想用无效语法做什么,我只是在澄清为什么语法错误以及一些解决方法,但不清楚我他的意图是什么
  • 感谢您的快速响应。 SteveTurczyn 是对的。带有“.content”的行只是为了举例说明一个正在工作而另一个没有工作。相反,我应该写“.read”。我想检查当前用户是否参与了对话的任何消息,他不是作者,是否已阅读或不显示有新消息的提示。但由于它在部分情况下无法轻松访问“.read”布尔值。
  • @GabrielTheCoder,检查我的编辑,使用has_many :through 关联,您可以查询消息以了解是否有来自 current_user 以外的用户的任何消息,即 read=false。
  • @arieljuod 解决了一些头痛问题,谢谢。但现在我必须遍历消息而不显示它们。如果我的大脑清醒了,明天我会再写一些
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多