在我的rails应用程序中,每个用户都有一个业力/分数,我通过用户模型计算如下:
after_invitation_accepted :increment_score_of_inviter
def increment_score_of_inviter
invitation_by.increment!(:score, 10)
end
def comment_vote_count
Vote.find(comment_ids).count * 2
end
def calculated_vote_count
base_score + comment_vote_count
end
def recalculate_score!
update_attribute(:score, calculated_vote_count)
end
我尝试创建所有用户的分页列表,按其分数排序。有数千名用户,我该如何有效地做到这一点?
我想到了使用:
User.all.sort_by(&:calculated_vote_count)
但是,这将非常沉重。
答案 0 :(得分:1)
非常直接:
User.order('score DESC').all
显然,你和Kaminari有User.order('score DESC').page(params[:page]).per(20)
的分页。
答案 1 :(得分:1)
嗯......在一个充满记录的表上使用User.all
将是你的应用程序的内存耗费。相反,你应该尝试在数据库层上完成你想要的东西。
此时我假设base_score
是表格列之一(base_score
与score
相同?),所以你必须做点什么如下所示(使用LEFT JOIN):
User.select("users.*, (COUNT(votes.id) * 2 + users.base_score) AS calculated_vote_count").joins("LEFT JOIN votes ON votes.user_id = user.id").order("calculated_vote_count DESC")
然后你可以按自己喜欢的方式对结果进行分页。
我没有测试它,但它应该可以工作。如果没有,请告诉我。