Rails按关联对象编号排序

时间:2010-08-09 14:16:06

标签: ruby-on-rails ruby sql-order-by

这个问题的标题可能有点偏,但它最接近我能达到的目的。

我有一个有很多评论的产品型号。我希望找到一种方法来获得评论最多的前十大产品。这可能吗?

目前我有:

Product.find(:all, :limit => 10)

这让我得到了我的10个产品,但显然没有考虑每个产品有多少评论。

干杯

EEF

3 个答案:

答案 0 :(得分:1)

如果Product for Comment上有一个计数器缓存列,那么您可以使用该列上的简单:order_by执行此操作。

修改:考虑动物的评论:

class Product < ActiveRecord::Base
  has_many :comments,
    :counter_cache => true
end

您需要products上名为comments_count的专栏:

add_column :products, :comments_count, :integer, :null => false, :default => 0

答案 1 :(得分:1)

或者,如果您不想更改模型,可以使用find_by_sql指定一个子选择,该子选择将告诉您每个产品有多少注释并按顺序排序。 E.g。

Post.find_by_sql("SELECT products.*
  FROM products, (SELECT COUNT(*) 
    FROM comments WHERE comments.product_id = products.id) AS product_comment_count
  ORDER BY product_comment_count DESC
  LIMIT 10")

您可能需要将语法调整为特定于您正在使用的RDBMS。

答案 2 :(得分:0)

试试这个:

Product.all(:select=> "products.*, COUNT(products.id) AS comments_count",
            :joins => :comments, 
            :group => "products.id", 
            :order => "comments_count",
            :limit => 10)

结果按注释计数排序,您可以按如下方式访问comments_count

@products.each do |product|
  p product.comments_count
end

确保您已将product_id表中的comments列编入索引。

注意:

我会使用counter_cache功能来满足此要求(由@tadman建议)。