2009-05-25 91 views
2

我有以下ActiveRecordsActiveRecord的查询

class Product < ActiveRecord::Base 
    has_many :reviews 
end 

class Review < ActiveRecord::Base 
    belongs_to :product 
end 

每次审查对象包含一个名为“评级”
场我希望得到的,其平均等级大于规定的约束较大的所有产品的列表。
我不明白如何使用find命令来做到这一点。
是否发现让我们做这样的事情?

回答

1

当查询开始询问像聚合值这样的情况时,我会使用SQL。有多种方法可以达到你想要的效果 - 这对我来说是最直接的:

bound = 3 
products = Product.where('id in 
    (
    select product_id 
    from reviews 
    group by product_id 
    having avg(rating) > ?)', bound) 
1

- 是的,它可以做到。像这样的财产以后应该做的伎俩......

Product.find(:all, :include => 'reviews', :conditions => ['review.rating > ?', min_rating]) 

编辑 - 只要重读你的问题。你想使用平均评分。我会诉诸SQL来做到这一点,或者如果它是一种常见操作,那么计算平均评级并在每次保存评级时将其存储在产品中。