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

class Line 
    belongs_to :document 
end 

sort_by @q, :total 

こんにちは、ドキュメントの行の合計(行数量)でドキュメントをソートする必要があります。Rails、Arel、Ransack:sort_by関係の和

私はransackerについて考えましたが、正しく書き込む方法はありますか?

ransacker :total do 
    parent ??? 
end 

答えて

2

あなたはafter_createと任意のLineオブジェクトのafter_destroy行の合計数を計算し、documentsline_count列でこれを保存検討する必要があります。これにより、クエリーが大幅に高速化され、データが見やすくなります。 Rails counter cachingも参照してください。これは、すべてのコールバックを自分で考えなくても実装できます。

ただし、COUNTとGROUP BYを使用してransackerでこれを行うこともできます。

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

たとえば、私のアプリケーションのdbでは、最初のレコードをカウント降順でソートするには、同等のクエリで4.5秒かかっていました。このデータベースには、結合テーブルごとに100万行以上の行がありますが、その問題を示しています。 'documents'テーブルに行数を格納すると、クエリは理解しやすく、非常に高速です。 –

+0

私は[これ](http://stackoverflow.com/questions/41984939/ransack-sort-on-count-of-habtm-or-hmt-associated-records)に賞金と多少関連した質問があります。あなたはそれに亀裂を服用したいですか? – BrunoFacca