2017-03-21 72 views
0

每个字符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") 
+0

您能向我们展示错误的完整堆栈跟踪吗? – niceman

回答

0

您需要在使用HAVING条款之前使用GROUP条款。尝试类似以下内容

@senderConversations.joins(:characters) 
    .where(characters: {id: @recipient.id}) 
    .group('character_id') 
    .having("COUNT(character.id) < 3") 
+0

恐怕我无法得到这个工作。如果你想数character.id,你必须由别的东西组合?我尝试通过conversations.id进行分组,但它返回的记录不止一个。 – Bazley

相关问题