我目前首先获得某个用户的所有朋友,然后将数组的大小作为朋友的数量。我担心的是,因为每次我从数据库中检索所有朋友信息时,它可能(或显然)效率低下。所以我想知道是否有一种方法可以在不获取任何其他信息的情况下有效地查询某个用户的朋友数量?
答案 0 :(得分:3)
如果您的关系声明正确,您应该能够user.friends.count
生成数据库级别的计数。
在我的控制台中查看生成的SQL查询(Drug has_many :details
和DrugDetail 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