2009-05-25 5 views
2

j'ai les ActiveRecords suivantsActiveRecord requête

class Product < ActiveRecord::Base 
    has_many :reviews 
end 

class Review < ActiveRecord::Base 
    belongs_to :product 
end 

Chaque objet d'examen contient un champ nommé « note »
Je souhaite obtenir une liste de tous les produits dont la note moyenne est supérieure à une borne spécifique.
Je ne comprends pas comment utiliser la commande find pour cela.
Est-ce que nous trouvons des choses comme ça?

Répondre

1

Je voudrais utiliser SQL lorsque les requêtes commencent à demander des choses comme des conditions sur les valeurs agrégées comme celui-ci. Il y a plusieurs façons d'atteindre le résultat que vous voulez - cela me semble plus simple:

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

-Oui, il peut le faire. Somthing comme celui-ci devrait faire l'affaire ...

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

Modifier - Il suffit de relire votre question. Vous voulez utiliser la note moyenne. Je ferais appel à SQL pour ce faire, ou si c'est une opération courante, calculer la note moyenne et le stocker dans le produit chaque fois qu'une note est enregistrée.