2010-08-09 45 views
0

这个问题的标题可能有点不合适,但它最接近我想要做的。通过关联的对象编号的轨道排序

我有一个产品模型has_many评论。我期望能够拿出评论最多的前10名产品。这可能吗?

目前我有:

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

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

干杯

EEF

回答

1

如果您对产品的评论计数器缓存列,那么你可以在该列一个简单的:order_by做到这一点。

编辑:以动物的评论到:

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

您将需要一个名为comments_countproducts列:

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

您还需要将belongs_to更改为belongs_to:product,:counter_cache => true – animal 2010-08-09 14:59:59

+0

的确如此。我只是在描述一般原则。 – tadman 2010-08-09 15:13:33

1

或者,如果你不想改变你的你的模型可以使用find_by_sql来指定一个子选项,它会告诉你每个产品有多少注释并按顺序排列。例如。

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。

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 

确保您已收录在commentsproduct_id列。

注:

我会用counter_cache功能这一要求(由@tadman的建议)。