2017-03-21 6 views
0

Jedes Zeichen has_many Konversationen (durch:: Chats) und jeder Conversation has_many Characters (durch: Chats). Ein Charakter kann eine Konversation mit nur einem anderen Charakter (zwei Teilnehmer) und andere Konversationen mit demselben Charakter und anderen Charakteren (drei oder mehr Teilnehmer) haben.Rails active select Datensätze durch Zählung von has_many durch Beziehung

Ich versuche, eine Abfrage zu erstellen, die nur die zwei Teilnehmer Gespräch auswählt.

Im Folgenden finden Sie ein fehlenden FROM-Klausel Eingabefehler. Ich habe viele Permutationen ausprobiert und kann es nicht richtig machen. Jede Hilfe würde sehr geschätzt werden.

Charakter

has_many :chats, foreign_key: "character_id", 
        dependent: :destroy 

has_many :conversations, through: :chats, source: :conversation 

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 

Logs:

PG :: UndefinedTable: ERROR: Fehlende FROM-Klausel Eintrag für die Tabelle "Zeichen" LINIE 1: ..._ " "Id "= $ 1 und" Zeichen-ID"= $ 2 mit COUNT (Charakter .... ^

: SELECT "". * FROM "Gespräche Gespräche" INNER JOIN "Chats" "chats_conversations_join" ON" chats_conversations_join "." conversation_id "=" Konversationen "." id "INNER JOIN" -Zeichen "ON" -Zeichen "." id "=" chats_conversations_join "." character_id "INNER JOIN" chattet auf "ON" -Konversationen "." id "=" chats "." conversation_id "WHERE" chattet "." character_id "= $ 1 UND" characters "." id "= $ 2 HAVING COUNT (character.id) < 3 ORDER BY" Konversationen "." id "ASC LIMIT 1 Abgeschlossen 500 Intern Serverfehler in 24ms (Active: 1,1 ms)

Active :: StatementInvalid (PG :: UndefinedTable: ERROR: miss inging FROM-Klausel Eintrag für Tabelle "Zeichen" LINE 1: ..._ ID "= $ 1 AND" Zeichen "." ID "= $ 2 HAVING COUNT (Zeichen ....

Ich hoffte, das würde funktionieren, aber es diesen Fehler gibt:

FROM-Klausel fehlender Eintrag für die Tabelle „Gespräche“

@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 
             ") 

Als Reaktion auf die erste Antwort ist die folgende fehlerhaft und ich kann nicht sehen, warum - er alle Gespräche findet Beteiligung der Empfänger, nicht nur das eins-zu-eins-Gespräch:

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

können Sie uns zeigen den vollständigen Stack-Trace des Fehlers? – niceman

Antwort

0

Sie müssen GROUP Aufzeichnungen vor HAVING Klausel auf sie zu benutzen. Versuchen Sie so etwas wie die folgenden

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

Ich fürchte, ich kann das nicht funktionieren. Wenn Sie character.id zählen möchten, müssen Sie nach etwas anderem gruppieren? Ich versuchte Gruppierung von conversations.id, aber es gibt mehr als einen Datensatz zurück. – Bazley

Verwandte Themen