Ruby on rails rails方法'exists'和'any'不一致`
我正在开发一个基于RubyonRails的聊天软件。因此,我最初在两个客户端之间创建一个对话,当他们将彼此添加为好友时,我的Ruby on rails rails方法'exists'和'any'不一致`,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我正在开发一个基于RubyonRails的聊天软件。因此,我最初在两个客户端之间创建一个对话,当他们将彼此添加为好友时,我的对话模型如下所示: class Conversation < ActiveRecord::Base has_many :messages belongs_to :player_client belongs_to :client end 这些都是期望值。但是在我的Rails代码中添加任何这些方法都会引发错误: NoMethodError (undefine
对话
模型如下所示:
class Conversation < ActiveRecord::Base
has_many :messages
belongs_to :player_client
belongs_to :client
end
这些都是期望值。但是在我的Rails代码中添加任何这些方法都会引发错误:
NoMethodError (undefined method `messages' for #<Conversation::ActiveRecord_AssociationRelation:0x007fa187ca1ec8>)`
NoMethodError(未定义的#的“messages”方法)`
我猜这是因为该对话不存在消息,所以它找不到该对话的任何关联。我不知道为什么这个方法会不一致
编辑:添加导致错误的代码
对话(与"玩家"客户端=@client.conversations.选择{| c | c.player(客户端)id==@game.player(客户端)id}
if conversation_with_player_client.count == 0
@conversation = @client.conversations.build({player_client_id: @game.player_client.id})
@conversation.save!
else
@conversation = @client.conversations.where({ player_client_id: @game.player_client.id })
end
puts "the conversation we found was #{@conversation.inspect}"
# This gives the response
# #<Conversation id: 7, player_client_id: 1, client_id: 11, created_at: "2018-02-12 20:55:55", updated_at: "2018-02-12 20:55:55">
# in the console so it can get the conversation
if @conversation.messages.any?
# this line is causing the error
如果与\u player\u client.count的对话=0
@conversation=@client.conversations.build({player\u client\u id:@game.player\u client.id})
@对话,救命!
其他的
@conversation=@client.conversations.where({player\u client\u id:@game.player\u client.id})
结束
放置“我们找到的对话是#{@conversation.inspect}”
#这就是答案
# #
#在控制台中,以便它可以获取对话
如果@conversation.messages.any?
#这一行导致了错误
您是否尝试了演示?
方法?我想这样会更好。。。像这样:
@conversation.messages.present?
如果消息为零或为空,它将返回false,所以我想它更适合。祝你好运 您是否尝试了
present?
方法?我想这样会更好。。。像这样:
@conversation.messages.present?
如果消息为零或为空,它将返回false,所以我想它更适合。祝你好运 该错误是由于您对一组对话而不是单个对话调用了
消息
我敢打赌违规代码是这样的:
client.conversations.messages#=>NoMethodError
相反,它应该是:
client.conversations.first.messages
编辑-这是导致错误的行:
@conversation=@client.conversations.where({player\u client:@game.player\u client.id})
其中
将返回表示多个对话的关系。如果您只需要一次对话,可以使用find\u by
:
@conversation=@client.conversations.find_by({player\u client:@game.player\u client.id})
该错误是由于您调用一组对话而不是单个对话的消息造成的
我敢打赌违规代码是这样的:
client.conversations.messages#=>NoMethodError
相反,它应该是:
client.conversations.first.messages
编辑-这是导致错误的行:
@conversation=@client.conversations.where({player\u client:@game.player\u client.id})
其中
将返回表示多个对话的关系。如果您只需要一次对话,可以使用find\u by
:
@conversation=@client.conversations.find_by({player_client:@game.player_client.id})
在您的代码中:
@conversation = @client.conversations.where({ player_client: @game.player_client.id })
这不是对话。不止一个。您不能在那里使用消息
如果你只需要一次对话,你必须改变地点
如果没有,则需要遍历所有对话。在代码中:
@conversation = @client.conversations.where({ player_client: @game.player_client.id })
这不是对话。不止一个。您不能在那里使用消息
如果你只需要一次对话,你必须改变地点
如果没有,您需要迭代所有对话。另一种方法是使用查找或创建方法:
@client.conversations.find_or_create_by(player_client: @game.player_client.id)
要查找更多信息:
使用查找或创建方法的另一种方法:
@client.conversations.find_or_create_by(player_client: @game.player_client.id)
要查找更多信息:
您应该发布导致错误的代码,但您似乎将.messages
应用于许多对话(或其他关联),而不是唯一的对话。@Pablo I按照您的建议添加了代码块。您应该发布导致错误的代码,但是你似乎正在将.messages
应用于许多对话(或其他关联),而不是一个唯一的对话。@Pablo我添加了代码块,因为你的建议编辑还是一样的,也许我添加的信息会有帮助?还是一样的,也许我添加的信息会有帮助?这就是我的想法,但是考虑到我正在使用where
子句寻找合适的对话,并且因为只有一个对话可以像这样存在,所以不应该是这样的,对吗?where
总是返回一个关系,而不是一个实例。这很好,因为你不必担心它会返回什么。但是在这种情况下,您需要find_by
或where(…)。首先Hmm好的,这是有意义的。感谢您的详细解释,我相信这对我将来也会有很大帮助。这也是我的想法,但考虑到我正在使用where
子句寻找合适的对话,而且因为只有一个对话可以像这样存在,所以不应该是这样的,对吗?where
总是返回一个关系,没有一个例子。这很好,因为你不必担心它会返回什么。但是在这种情况下,您需要find_by
或where(…)。首先Hmm好的,这是有意义的。谢谢你的详细解释,我相信这对我将来会有很大的帮助。还有什么是最好的方法呢?答案中已经有了。使用find_by只选择一个对话,那么最好的方法是什么?答案中已经有。使用“查找方式”仅选择一个对话