Ruby on rails Rails的作用域,它根据信誉评分对用户进行排序
我有一个用户表,我对每个用户都有一个声誉分数。声誉得分是两个因素的综合得分:Ruby on rails Rails的作用域,它根据信誉评分对用户进行排序,ruby-on-rails,ruby-on-rails-4,scope,filtering,Ruby On Rails,Ruby On Rails 4,Scope,Filtering,我有一个用户表,我对每个用户都有一个声誉分数。声誉得分是两个因素的综合得分: 用户项目(他/她创建的项目)的关注者总数 用户任务(他/她创建的任务)的总投票数 我的目标是允许用户按最近的(标准索引操作)或信誉最高的用户筛选用户。Rails的哪个范围会按照从最高到最低的顺序返回按此“总声誉分数”排序的用户列表?thx 我的代码如下: User.RB模型 def total_reputation_score project_follower_count + task_vote_count end
def total_reputation_score
project_follower_count + task_vote_count
end
scope :by_reputation, -> { #HOW DO I CREATE THIS SCOPE? }
用户控制器
def index
@users = User.text_search(params[:query]).paginate(page: params[:page], :per_page => 12)
end
def most_reputation
@users = policy_scope(User)
@users = @users.
text_search(params[:query]).
by_reputation.
paginate(page: params[:page], :per_page => 12)
render :index
end
虽然您可以在SQL中动态执行此操作,但您确实希望:
为此处显示的两个计数项中的每一项添加一个;这会将这些列添加为Rails将为您维护的计算列,然后为您的范围执行以下操作:
User.order(User.arel_table[:project_follower_count] + User.arel_table[:task_vote_count]).reverse_order
(或类似的东西)
或者,您可以在RDBMS上加倍,并构建索引以便动态处理 谢谢corey-为了确保我能理解。。。只需在Users表中添加一个新的整数字段,用于project\u follower\u count和task\u vote\u count。一旦我有了这些,我就可以做:范围:按声誉,->{User.order(User.arel\u table[:project\u follower\u count]+User.arel\u table[:task\u vote\u count)。颠倒顺序}是这样的,还是我不再需要这个范围了?@BB500我会使用一个范围,是的。你还需要设置计数器缓存。现在在手机上,但你可以通过谷歌查找文档/示例。@BB500为什么会有很多任务投票?对我来说似乎是一种归属关系。对“项目追随者”不确定,取决于体系结构。@BB500明白了;一般来说,混乱的体系结构会导致大量的下游工作。如果您负担得起,可能值得花时间进行修改和简化。您对内置功能的依赖程度越高,测试或维护的工作量就越少!