我有一个has_many
得分的提交模型。在Score模型中,我得分为1:float,score2:float,score3:float,score4:float,score5:float。
现在,我想根据提交内容的加权总分数对提交内容进行排序。所以,我在submission.rb中创建了一个方法:
def total_score
scores.sum('(0.15 * scores.score1) + (0.15 * scores.score2) +
(0.20 * scores.score3) + (0.25 * scores.score4) + (0.25 * scores.score5)')
end
def sorted_by_total_score
Submission.all.sort_by(&:total_score)
end
然后我将方法调用到我的pages_controller.rb:
def score_summary
@find = Submission.ransack(params[:q])
@submissions = @find.result.includes(:user, scores: [:admin_user]).paginate(page: params[:page], per_page: 50).sorted_by_total_score
end
但它有错误:
undefined method `sorted_by_total_score' for #<Submission::ActiveRecord_Relation:0x007fdccc156d68>
我哪里做错了?谢谢。
更新:通过第九回答解决。
现在,我有另一个问题。这是pages_controller.rb中的当前代码:
def score_summary
@find = Submission.ransack(params[:q])
@submissions = @find.result.includes(:user, scores: [:admin_user]).sort_by{|submission| -submission.total_score}
@submissions = @submissions.pagination(page: params[:page], per_page: 50)
end
在视图中我把分页:
<div class="row">
<div class="col-md-8 col-md-offset-2 col-xs-12 text-center">
<%= will_paginate @submissions, renderer: BootstrapPagination::Rails %>
</div>
</div>
代码现在应该正常工作,但是我收到了这个错误:
NoMethodError in PagesController#score_summary
undefined method `pagination' for #<Array:0x007faef8923548>
更新:已解决
如果控制器中有sort_by,则需要将这些代码放入application_controller.rb中以使分页工作。
require 'will_paginate/array'
答案 0 :(得分:1)
我无法理解你为什么再次需要Submission.all。我想你只需要对结果进行排序。
@submissions = @find.result.includes(:user, scores: [:admin_user]).sort_by{|submission| submission.total_score}.paginate(page: params[:page], per_page: 50)
如果你想按降序排列,你可以使用
sort_by{|submission| -submission.total_score}
还包括&#39; self&#39;在得分计算之前