私はモデルを持っUser
ていGift
ます。ユーザーは他のユーザーにギフトを送ることができます。どのユーザーがギフトを受け取ったかを示すリレーショナル テーブルがあります。一方、ユーザーは、School
無料または有料の に属します。
特定の種類の学校 (無料または有料) で先週ギフトを受け取ったユーザーの数を知りたいです。
できます:
Gift.joins(:schools).where("created_at >= ? AND schools.free_school = ?", Time.now.beggining_of_week, true).collect(&:gift_recipients).flatten.uniq.count.
または、先週ギフトを送信したユーザーの数を知りたいです。これは機能します:
Gift.joins(:schools).where("created_at >= ? AND schools.free_school = ?", Time.now.beggining_of_week, true).collect(&:user_id).uniq.count.
過去 1 週間に何人のユーザーがギフトを送信または受信したかを知りたい場合は、次のようにします。
(Gift.joins(:schools).where("created_at >= ? AND schools.free_school = ?", Time.now.beggining_of_week, true).collect(&:gift_recipients).flatten + Gift.joins(:schools).where("created_at >= ? AND schools.free_school = ?", Time.now.beggining_of_week, true).collect(&:user_id)).uniq.count
これはすべて正常に機能しますが、データベースが十分に大きい場合、これは非常に遅くなります。必要に応じて生の SQL を使用して、より効率的にするための提案はありますか?
"gifts"
user_id (integer)
school_id (integer)
created_at (datetime)
updated_at (datetime)
"gift_recipients" is a table like
gift_id | recipient_id,