Ruby on rails rails方法'exists'和'any'不一致`

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

我正在开发一个基于RubyonRails的聊天软件。因此,我最初在两个客户端之间创建一个对话,当他们将彼此添加为好友时,我的
对话
模型如下所示:

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只选择一个对话,那么最好的方法是什么?答案中已经有。使用“查找方式”仅选择一个对话