2013-06-11 46 views
2

我目前首先獲取某個用戶的所有朋友,然後將該數組的大小作爲朋友的數量。我擔心的是,由於每次我從數據庫中檢索所有朋友信息,它都可能(或顯然)效率低下。所以我想知道是否有一種方法可以有效地查詢某個用戶的朋友的數量而無需獲取任何其他信息?有效查詢朋友的人數?

回答

3

如果您的關係被正確聲明,您應該能夠執行user.friends.count以生成DB級別的計數。

在這裏看到我的控制檯中的SQL查詢生成Drug has_many :detailsDrugDetail belongs_to :drug):

irb(main):003:0> Drug.first.details 
    Drug Load (0.7ms) SELECT "drugs".* FROM "drugs" LIMIT 1 
    DrugDetail Load (1.9ms) SELECT "drug_details".* FROM "drug_details" WHERE "drug_details"."drug_id" = 1771 
=> [] 

irb(main):004:0> Drug.first.details.count 
    Drug Load (0.7ms) SELECT "drugs".* FROM "drugs" LIMIT 1 
    (0.6ms) SELECT COUNT(*) FROM "drug_details" WHERE "drug_details"."drug_id" = 1771 
=> 0 

irb(main):006:0> Drug.first.details.to_a.size 
    Drug Load (2.1ms) SELECT "drugs".* FROM "drugs" LIMIT 1 
    DrugDetail Load (0.5ms) SELECT "drug_details".* FROM "drug_details" WHERE "drug_details"."drug_id" = 1771 
=> 0 

在你的情況,如果你有這樣的關係:

User has_many :friends 
Friend belongs_to :user 

然後這應該在數據庫級執行並且比第一段代碼快:

User.first.friends.count 
+0

在'User.first.friends.count'中,如何指定特定用戶的朋友數? – OneZero

+0

我不知道,這取決於你需要什麼用戶。在用戶控制器的show動作中,它將是'User.where(id:params [:id])''。你通常如何檢索這個特定用戶? – MrYoshiji