我使用分類模型在Projets和類別之間建立了has_many, through:
關係。一個Projet belongs_to
一個客戶端。在Rails中對具有許多關係的查詢進行分組
class Client < ApplicationRecord
has_many :projets
end
class Category < ApplicationRecord
has_many :categorizations, dependent: :destroy
has_many :projets, through: :categorizations
end
class Categorization < ApplicationRecord
belongs_to :category
belongs_to :projet
end
class Projet < ApplicationRecord
belongs_to :client
has_many :categorizations, dependent: :destroy
has_many :categories, through: :categorizations
end
對於一個特定的類別,我想列出所有projets,由客戶端分組。例如
(對於CATEGORY_ID = 3)
客戶端A PROJET 1 PROJET 2
客戶端B PROJET 3
客戶端C PROJET 4
到目前爲止我能得到這個工作,但只能通過使用兩個查詢(其中一個是非常低效的(n + 1問題))
這是代碼
def listing
@projets_clients = Projet
.select("client_id")
.includes(:client)
.joins(:categorizations)
.where(categorizations: { category: @category })
.group("client_id")
@clients = []
@projets_clients.each do |p|
@clients << Client.includes(:projets).find(p.client_id)
end
end
如果任何人都可以提出一個更好的方法,我很想了解如何優化這是我一直沒能找到一個更好的辦法嘍。
謝謝。
哇,非常感謝你的細節答案! SQL方法非常有趣。對不起,與'projets'(它的法文)混淆。 雖然在你的第一個例子中的代碼有一個小錯誤,但感謝您的慷慨幫助(如何嵌套包括!)我想我弄明白了它是什麼: @projects_by_client = @ category.projects.group_by(& client_id) (還需要添加.projects - 並且'@clients ='這一行也與我無關) 也許這對其他人來說更新這個&然後我可以將它標記爲正確的答案? 現在它完美的工作,非常感謝你! – Chris
我更新了代碼以修復您發現的錯誤。 – Genzume