这个问题的标题可能有点不合适,但它最接近我想要做的。通过关联的对象编号的轨道排序
我有一个产品模型has_many评论。我期望能够拿出评论最多的前10名产品。这可能吗?
目前我有:
Product.find(:all, :limit => 10)
这让我我的10个产品,但它显然没有考虑每个产品有多少条评论了。
干杯
EEF
这个问题的标题可能有点不合适,但它最接近我想要做的。通过关联的对象编号的轨道排序
我有一个产品模型has_many评论。我期望能够拿出评论最多的前10名产品。这可能吗?
目前我有:
Product.find(:all, :limit => 10)
这让我我的10个产品,但它显然没有考虑每个产品有多少条评论了。
干杯
EEF
如果您对产品的评论计数器缓存列,那么你可以在该列一个简单的:order_by
做到这一点。
编辑:以动物的评论到:
class Product < ActiveRecord::Base
has_many :comments,
:counter_cache => true
end
您将需要一个名为comments_count
上products
列:
add_column :products, :comments_count, :integer, :null => false, :default => 0
或者,如果你不想改变你的你的模型可以使用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。
试试这个:
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
确保您已收录在comments
表product_id
列。
注:
我会用counter_cache
功能这一要求(由@tadman
的建议)。
您还需要将belongs_to更改为belongs_to:product,:counter_cache => true – animal 2010-08-09 14:59:59
的确如此。我只是在描述一般原则。 – tadman 2010-08-09 15:13:33