我有一个用户和帖子模型,并且正在使用acts_as_votable gem(它给我一个“投票”表)来支持/反对一个帖子。我想为每个用户分配业力,其中业力是用户从他/她的所有帖子中获得的赞成票数减去反对票总数。
目前我在用户模型上有这个实例方法来计算业力:
def karma
count = 0
self.posts.each do |post|
count += post.upvotes.size - post.downvotes.size
end
return count
end
我不认为上面的运行时间为 O(2n) 时效率很高,因为对于每个帖子都需要两个额外的数据库查询,一个用于赞成票,一个用于反对票。
关于如何将上述内容组合成一个查询或以其他方式使其更有效的任何想法?