簡體   English   中英

Rails activerecord通過關系的has_many計數選擇記錄

[英]Rails activerecord select records by count of has_many through relation

每個角色都有has_many對話(通過:chats),每個對話has_many角色(通過:chats)。 一個角色可能有一個僅涉及一個其他角色的對話(兩名參與者),而另一個涉及同一角色和其他角色的對話(三個或更多參與者)。

我正在嘗試構建僅選擇兩方對話的查詢。

下面給出了缺少的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: ERROR:  missing FROM-clause entry for table "character"
LINE 1: ..._id" = $1 AND "characters"."id" = $2 HAVING COUNT(character....
                                                             ^

: SELECT  "conversations".* FROM "conversations" INNER JOIN "chats" "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 Server Error in 24ms (ActiveRecord: 1.1ms)

ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "character"
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")

您需要先對GROUP記錄使用HAVING子句。 試試下面的東西

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM