2016-04-23 39 views
0
class Document 
    has_many :lines 
end 

class Line 
    belongs_to :document 
end 

sort_by @q, :total 

你好,我需要通過他們的行的總和(行數量列)對文檔進行排序。Rails,Arel,Ransack:sort_by的關係總和

我想到了一個搜捕器,但是如何正確書寫呢?

ransacker :total do 
    parent ??? 
end 

回答

2

你可能要考慮計算行的總數after_create和after_destroy任何Line對象和documentsline_count列存儲如此。這將使查詢速度顯着加快,並使數據易於查看。看看Rails counter caching也可以實現這一點,而不必考慮所有的回調。

但是,你也可以通過使用COUNT和GROUP BY來做到這一點。下面是一個快速的例子:

ransacker :line_count do 
    query = "(SELECT COUNT(lines.id) FROM lines WHERE lines.document_id = documents.id GROUP BY lines.document_id)" 
    Arel.sql(query) 
    end 
+0

給你一個例子,在我的應用程序的數據庫上,等價查詢花費了4.5秒來獲取按count遞減排序的第一條記錄。該數據庫在每個連接表中都有超過一百萬行,但它說明了這個問題。如果將行數存儲在「文檔」表中,則該查詢既易於理解又非常快速。 –

+0

我有[此](http://stackoverflow.com/questions/41984939/ransack-sort-on-count-of-habtm-or-hmt-associated-records)與賞金有些相關的問題。你想對它進行破解嗎? – BrunoFacca