sql - 帮助优化ActiveRecord查询(投票系统)

标签 sql mysql ruby-on-rails ruby activerecord

我有一个带有两个模型的投票系统:Item(id, name) 和 Vote(id, item_id, user_id)。

这是我到目前为止的代码:

class Item < ActiveRecord::Base
  has_many :votes

  def self.most_popular
    items = Item.all #where can I optimize here?
    items.sort {|x,y| x.votes.length <=> y.votes.length}.first #so I don't need to do anything here?
  end
end

这有一些问题,主要是我检索所有的 Item 记录,然后使用 Ruby 来计算流行度。我几乎肯定有一个简单的解决方案,但我不能完全确定它。

我更愿意收集记录并在初始查询中运行计算。这样,我可以向查询添加一个简单的 :limit => 1 (或 LIMIT 1)。

任何帮助都会很棒——要么在所有 ActiveRecord 中重写,要么甚至在原始 SQl 中重写。后者实际上可以让我更清楚地了解我想要执行的查询的性质。

最佳答案

按项目 ID 对投票进行分组,按计数排序,然后取第一个项目。在 Rails 3 中,代码是:

Vote.group(:item_id).order("count(*) DESC").first.item

在 Rails 2 中,这应该可以工作:

Vote.all(:order => "count(*) DESC", :group => :item_id).first.item

关于sql - 帮助优化ActiveRecord查询(投票系统),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3808021/

相关文章:

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - 时差rails(其中DATE mysql)

ruby-on-rails - Rails 仅针对开发环境运行迁移

ruby-on-rails - Asset Pipeline 不提供 Assets ,但没有错误。这个配置看起来正确吗?

php - 即使在 codeigniter 中语句为 False 时查询返回数据

ruby-on-rails - Rails 3 已经发布,现在没有 2.3.x 的在线文档

sql - 与单个更新语句组合的更新查询

mysql - 基于条件的SQL查询

Mysql 如何使用 UTF8 字符集添加 varchar(21884) 列?

Mysql 带有连接的子查询