这个问题的标题可能有点偏,但它最接近我能达到的目的。
我有一个有很多评论的产品型号。我希望找到一种方法来获得评论最多的前十大产品。这可能吗?
目前我有:
Product.find(:all, :limit => 10)
这让我得到了我的10个产品,但显然没有考虑每个产品有多少评论。
干杯
EEF
答案 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
建议)。