[英]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.