2009-11-08 55 views
0

我正在處理一個應用程序,我需要查找用戶提交的用戶提交的項目的數量。試圖從兩級深度關聯中找到物品的計數,有什麼想法?

對於實施例 -

用戶1已經稱爲3人(用戶2,用戶3,用戶4),並且每個這些用戶的提交5成的製品。

我想找到一種方法來獲取User1樹中提交的項目的計數(在這種情況下應該是15)。

我的用戶模型如下所示(簡化)

class User < ActiveRecord::Base 
    # Code for user referrals 
    belongs_to :referrer, :class_name => "User" 
    has_many :referrals, :class_name => "User", :foreign_key => "referrer_id" 
    has_many :items 
end 

我可以找出每個用戶輕鬆(User.items.size)計數,但我無法找到一個解決方案,以獲得推薦計爲一個總和。

任何想法?

回答

2

ID試試這個:

user = User.find(1) 
total_items_size = user.referrals.map(&:items).flatten.size 
+0

這是一種非常新穎的方式!我會保留在我的一些其他關係,不會像用戶/推薦一樣大! 如果我可以爲你添加一些代表,我會... 謝謝。 – Dean

0

獲取用戶的所有項目進行的1

total = 0 
Users.find(1).referrals.each do |refer| 
    total += refer.items.size 
end 
+0

我曾試過這個,但對於大量的被推薦的用戶來說,它將變得相當開銷。我也會考慮在用戶模型上緩存計數,但是希望遠離這一點。 謝謝! – Dean

2

您可以使用select_value手動運行SQL查詢:

def referred_items_count 
    select_value("select count(*) as referred_items 
    from items inner join users on users.id = items.user_id 
    where users.referrer_id = #{self.id};", "referred_items") 
end 

的好處是它比使用Ruby計數更具可擴展性。

+0

這是我在另一篇文章中發現的,但想保留原始SQL,但它看起來像這是最好,最有效的方式或做到這一點。 感謝您的回覆! – Dean

相關問題