Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails-访问当前用户的嵌套属性_Ruby On Rails_Ruby_Model_Nested Attributes - Fatal编程技术网

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

Ruby on rails RubyonRails-访问当前用户的嵌套属性,ruby-on-rails,ruby,model,nested-attributes,Ruby On Rails,Ruby,Model,Nested Attributes,我试图访问rails部分中的一些嵌套属性;让我解释一下我的问题: 根据我在另一个问题中提到的dana mulder教程,我编写了一个简单的消息服务。用户有许多对话,而对话有许多消息。每个对话都有一个收件人和一个发件人,每条消息都有一个布尔值read,默认设置为false 我想做的是编写一个简单的函数,迭代用户在对话中收到的每一条消息,检查用户在对话中收到的最后一条消息是否为read==true和not自己发送,并在我的应用程序导航中的“messages”链接旁边显示一个小旋钮 我主要想检查的是(

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

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

我想做的是编写一个简单的函数,迭代用户在对话中收到的每一条消息,检查用户在对话中收到的最后一条消息是否为read==true和not自己发送,并在我的应用程序导航中的“messages”链接旁边显示一个小旋钮

我主要想检查的是(多行以提高可读性):


旁边有气泡的消息链接
消息链接
此语法不起作用。。 如何迭代用户参与的每个会话,检查每个会话的最后一条消息(如果该消息是由该用户编写的),如果不是,则检查它是否已被读取

Conversation.last.messages.last.content
这样的东西在工作时,
当前用户.conversations.all.messages.last.content
不是。。我发现rails模型的可访问性是如何工作的有点混乱

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


向您致以最诚挚的问候

您打算如何处理当前用户.对话.所有.消息.最后.内容?因为
conversations.all
是一个关联,它不是一个对话,所以
messages
不是一个可用的方法<代码>对话。最后一个是一个对话,这就是为什么你可以在上面调用
消息

您可以尝试
当前用户.conversations.last.messages.last.content
获取上一次对话的最后一条消息,或者,您可以对用户使用“has\u many:through”关系

class User ...
  has_many :conversations
  has_many :messages, through: :conversations
end
这样,如果希望所有用户的消息和
当前用户的消息.messages.last
获取最后一条消息(即使它不是来自上一次对话),则可以执行
当前用户.messages

我建议您阅读有关关联的Rails指南

编辑:要知道用户是否有未读消息,您可以使用
has\u many:through
关联并执行以下操作

current_user.messages.where(read: false).where.not(user_id: current_user.id).any?
这将返回id为的用户对话中的任何消息未读取当前_user.id。和
false
否则


如果您不想知道未读邮件的实际数量,可以使用
count
而不是
any?

每个对话都有单独的邮件链接吗?还是所有对话都只有一个?我想你需要循环每一个对话。“conversations.all.messages”将不会像“conversations.all”那样返回活动的关系对象。(在旁注中,如果有很多对话,应该避免使用“all”。它会将所有对话加载到内存中,导致内存使用率高)我认为这不会符合OP的意图。如果对话1的最后一条消息来自其他人且未读,但对话2的最后一条消息来自他自己,他将不知道有一个他没有看到最新消息的对话。@SteveTurczyn,这就是为什么我问他如何处理语法无效的行,我刚刚澄清了语法错误的原因以及一些解决方法,但我不清楚他的意图是什么。谢谢你的快速回复。史蒂夫图尔钦是对的。“内容”一行只是为了举例说明一个有效,另一个无效。相反,我应该写“阅读”“。我想检查当前用户参与的对话中是否有任何消息,他不是该对话的作者,是否已阅读或未显示有新消息的提示。但是,由于部分im无法访问“已阅读”“布尔值很容易。@GabrielTheCoder,检查我的编辑,使用
有很多:通过
关联,你可以查询消息,以知道是否有来自当前用户以外的其他用户的消息是read=false。@arieljuod解决了一点头疼的问题,谢谢。但是现在我必须在不显示的情况下迭代消息。”如果我头脑清醒的话,明天我会再写一些
current_user.messages.where(read: false).where.not(user_id: current_user.id).any?