我有User
和Gift
模型。用户可以向其他用户发送礼物。我有一个关系表,告诉我哪些用户收到了礼物。另一方面,用户属于 a 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.
如果我想知道上周有多少用户发送或收到了礼物,我可以这样做:
(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,