0

現在、これらのスコープを使用して、顧客レコードの特定の日付範囲のタスクのレコードを取得しています。

scope :by_current_month, lambda { where("created_at >= '{date.beginning_of_month.to_s(:db)}' AND created_at <= '#{date.end_of_month.to_s(:db)}'") }
scope :by_months_ago, lambda { |month| where("created_at >= '#{date.months_ago(month).beginning_of_month.to_s(:db)}' AND created_at <= '#{date.months_ago(month).end_of_month.to_s(:db)}'") }
scope :in_last_year, lambda { where("start_date >= '#{date.months_ago(12).beginning_of_month.to_s(:db)}' AND start_date <= '#{date.months_ago(0).end_of_month.to_s(:db)}'") }

これらはすべてテーブルの Customers インデックス ページに表示されます。ページの読み込みを大幅に遅くするクエリの負荷があります。速度を向上させるためにキャッシュするか、何かを実行する最良の方法がわかりません。

<%= customer.tasks.find_by_status(1).count %>
<%= customer.tasks.by_current_month.count %>
<%= customer.tasks.in_last_year.count %>

これにより、次のクエリが大量に生成されます。

Task Load (0.2ms)  SELECT "tasks".* FROM "tasks" WHERE "tasks"."customer_id" = 1 AND (STATUS NOT IN (4,5))
(0.1ms)  SELECT COUNT(*) FROM "tasks" WHERE "tasks"."customer_id" = 1 AND (created_at >= '2013-06-01' AND created_at <= '2013-06-30')
(0.1ms)  SELECT COUNT(*) FROM "tasks" WHERE "tasks"."customer_id" = 1 AND (start_date >= '2012-06-01' AND start_date <= '2013-06-30')
4

0 に答える 0