每个字符has_many对话(通过:聊天室)和每个对话has_many字符(通过:聊天室)。一个角色可能只有一个对话只涉及一个其他角色(两个参与者),以及涉及相同角色和其他角色(三个或更多参与者)的其他对话。Rails的activerecord通过关系选择记录的计数has_many
我想构建一个只选择双参与者对话的查询。
以下给出一个丢失的FROM子句条目错误。我已经尝试了很多排列组合,并且无法正确使用它。任何帮助将不胜感激。
字
has_many :chats, foreign_key: "character_id",
dependent: :destroy
has_many :conversations, through: :chats, source: :conversation
对话
has_many :chats, foreign_key: "conversation_id",
dependent: :destroy
has_many :characters, through: :chats, source: :character
def self.FindOneToOneConversation(sender, recipient)
@sender = Character.find_by(callsign: sender)
@recipient = Character.find_by(callsign: recipient)
@senderConversations = @sender.conversations
@senderAndRecipientConversation = @senderConversations.joins(:characters)
.where(characters: {id: @recipient.id})
.having("COUNT(character.id) < 3")
return @senderAndRecipientConversation.first # .first because @senderAndRecipientConversations is a collection
end
日志:
PG :: UndefinedTable:错误:缺少FROM子句为表 “性格” 进入第1行:..._ “ ”ID “= $ 1” 字编号“= $具有2 COUNT(人物.... ^
:选择 ”“。* FROM ”对话的对话“ INNER JOIN ”聊天“, ”chats_conversations_join“ ON” chats_conversations_join “。”conversation_id“=”conversations“。”id“INNER JOIN”characters“ON”characters“。”id“=”chats_conversations_join“。”character_id“INNER JOIN”chats“ON”conversations“。”id“=”chats “。”conversation_id“WHERE”chats“。”character_id“= $ 1 AND”characters“。”id“= $ 2 HAVING COUNT(character.id)< 3 ORDER BY”conversations“。”id“ASC LIMIT 1 Completed 500 Internal服务器错误在24ms(ActiveRecord:1.1ms)
ActiveRecord :: StatementInvalid(PG :: UndefinedTable:ERROR:miss表示“字符”的FROM子句条目 LINE 1:..._ id“= $ 1 AND”characters“。”id“= $ 2 HAVING COUNT(character ....
我希望这可以工作,但它给出了这样的错误:
缺少FROM子句条目表“对话”
@senderAndRecipientConversation = Conversation.select('*, COUNT(chats.character_id)')
.from("(#{@senderConversations.to_sql}) AS sender_conversations")
.joins("
INNER JOIN chats
ON sender_conversations.id = chats.conversation_id
GROUP BY chats.conversation_id
HAVING COUNT(chats.character_id) < 3
")
针对第一个答案,以下是有缺陷的,我不明白为什么 - 它发现涉及的所有对话收件人,不只是一对一的对话:
@senderAndRecipientConversation = @senderConversations.joins(:characters)
.where(characters: {id: @recipient.id})
.group('conversations.id')
.having("COUNT(characters.id) < 3")
您能向我们展示错误的完整堆栈跟踪吗? – niceman