2010-08-09 8 views
0

Le titre de cette question pourrait être un peu off, mais c'est le plus proche que je pouvais obtenir à ce que je suis en train de faire.Rails commander par numéro d'objet associé

J'ai un modèle de produits qui has_many Comments. Je cherche à trouver un moyen d'attraper les 10 meilleurs produits avec le plus de commentaires. Est-ce possible?

Au moment j'ai:

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

Cela me reçoit mes 10 produits, mais il ne peut évidemment pas tenir compte combien de commentaires chaque produit a.

Vive

Eef

Répondre

1

Si vous avez une colonne de cache de compteur sur le produit pour un commentaire, vous pouvez le faire avec un :order_by simple sur cette colonne.

Edit: Prendre le commentaire de l'animal en compte:

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

Vous aurez besoin d'une colonne de products appelé comments_count:

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

Vous aurez également besoin de changer le belongs_to dans Comment to belongs_to: product,: counter_cache => true – animal

+0

C'est vrai. Je viens de décrire le principe général. – tadman

1

Alternativement, si vous ne voulez pas modifier votre modèle vous Vous pouvez utiliser find_by_sql pour spécifier une sous-sélection qui vous dira combien de commentaires chaque produit a et commande par cela. Par exemple.

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") 

Vous devrez peut-être ajuster la syntaxe pour qu'elle soit spécifique à tout SGBDR que vous utilisez.

0

Essayez ceci:

Product.all(:select=> "products.*, COUNT(products.id) AS comments_count", 
      :joins => :comments, 
      :group => "products.id", 
      :order => "comments_count", 
      :limit => 10) 

Résultat est trié par le nombre de commentaires et vous pouvez accéder à la comments_count comme suit:

@products.each do |product| 
    p product.comments_count 
end 

Assurez-vous que vous avez indexé la colonne product_id dans le tableau comments.

Note:

J'utiliser la fonction counter_cache pour cette exigence (comme suggéré par @tadman).