ruby-on-rails - Rails 通过两个模型实例按计数排序

标签 ruby-on-rails ruby

我有这段代码可以对每个项目进行投票。在我看来,我想按照票数从高到低的顺序列出每个项目。

我找到了一种方法,但是还有更好的方法吗?

我的方式:

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但这似乎有点太多了。无需添加计数列。

还有什么建议吗?

更新 好吧,有两件事

  1. @jgautsch 成功了,但我很好奇,这是一个类方法,不是吗 想让它成为一个实例方法吗?还是无所谓?只是 脱掉自己?我有时会感到困惑(就像阅读关于 this) 什么时候适用于实例类方法。

  2. 此外,我注意到我只会获得已投票的项目。 即使有 0 票,我将如何继续显示它们?我什至去掉了 limitnum 参数

最佳答案

查看此问题: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/

相关文章:

ruby-on-rails - Rails 追加数据库

java - LAMP中 'P'有什么意义?为什么是 PHP、Perl 或 Python?

ruby-on-rails - Rails 扩展 Date 类

ruby - OpenSSL::X509::证书显示错误域的证书

ruby - 你如何在 Ruby webapps 中进行性能测试?

ruby-on-rails - Rails 如何将对象传递到 View ?

mysql - 是我的代码问题还是 Sidekiq 速度慢,因为它不应该访问 Rails 模型?

mysql - rails 4 : ActiveRecord or MySQL query where no related models have attribute

ruby-on-rails - 查找文件的上次修改日期

ruby - 从 irb 获取所有局部变量或可用方法?