我有User
和Gift
型號。用戶可以將禮物發送給其他用戶。我有一個關係表,告訴我哪些用戶收到了禮物。另一方面,用戶屬於School
,可以免費或付費。使這個ActiveRecord查詢更有效率?
我想要在上週收到特定類型學校(這是免費或付費)禮物的用戶數。
我可以這樣做:
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,
請張貼用戶,禮物和學校的模式/模型。 – Winfield