2

我目前首先获取某个用户的所有朋友,然后将数组的大小作为朋友的数量。我担心的是,因为每次我从数据库中检索所有朋友信息时,它都可能(或显然)效率低下。所以我想知道是否有一种方法可以在不获取任何其他信息的情况下有效地查询某个用户的朋友数量?

4

1 回答 1

3

如果您的关系声明正确,您应该能够user.friends.count生成数据库级别的计数。

在我的控制台中查看生成的 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
于 2013-06-11T14:47:20.413 回答