現在、これらのスコープを使用して、顧客レコードの特定の日付範囲のタスクのレコードを取得しています。
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')