我有这段代码可以对每个项目进行投票。在我看来,我想按照票数从高到低的顺序列出每个项目。
我找到了一种方法,但是还有更好的方法吗?
我的方式:
Controller
class Admin::ProjectsController < ApplicationController
def index
@projects = Project.all.sort_by { |project| project.votes.count }
end
end
观看次数
- @projects.each do |project|
%li= project.name
%li= project.teacher_firstname
%li= project.teacher_lastname
%li= project.votes.count
我试图按照 Project.votes.all.order(:desc)
的思路做一些事情,但显然这行不通,但这就是我想尝试做的。
然后有人指出我 :counter_cache但这似乎有点太多了。无需添加计数列。
还有什么建议吗?
更新 好吧,有两件事
@jgautsch 成功了,但我很好奇,这是一个类方法,不是吗 想让它成为一个实例方法吗?还是无所谓?只是 脱掉自己?我有时会感到困惑(就像阅读关于 this) 什么时候适用于实例类方法。
此外,我注意到我只会获得已投票的项目。 即使有 0 票,我将如何继续显示它们?我什至去掉了
limit
和num
参数
最佳答案
查看此问题:Rails 3 ActiveRecord: Order by count on association
如链接问题中所述,您可以使用 counter_cache 并将查询保留在一个表中(在此处添加一列没有错),或者执行类似的操作(未经测试):
class Project
has_many :votes
def self.top_voted(num = 10)
select("projects.id, OTHER_ATTRS_YOU_NEED, count(votes.id) AS votes_count")
.joins(:votes)
.group("projects.id")
.order("votes_count DESC")
.limit(num)
end
end
Project.top_voted(5) # top 5 most voted projects
关于ruby-on-rails - Rails 通过两个模型实例按计数排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28142498/