2009-06-16 9 views
0

Faire semblant J'ai un modèle, Post qui has_many: commentaires. Comment puis-je afficher uniquement les posts qui ont des commentaires? Je suis un peu à l'aise avec named_scope mais je ne sais pas comment je peux mettre Post.comments (ou self.comments) dans le hash: conditions qui attend des symboles.Conditions ActiveRecord d'une association (Rails)

class Post < ActiveRecord::Base 
    has_many :comments 
    named_scope :with_comments, :conditions => [#self.comments.length > 0] 
end 

Qu'est-ce que j'écris dans la zone commentée?

Merci!

Répondre

1

Mieux peut-être mettre un counter_cache sur Post.

class Comment < AR:Base 
    belongs_to :post, :counter_cache => true 
end 

Ensuite, vous avez seulement besoin de faire 1 requête au lieu de deux.

Post.find(:all, :conditions => ["counter_cache > 0"])

+0

+1: beaucoup plus efficace que de faire une jointure. –

2

Vous devriez être en mesure de se joindre simplement contre votre table commentaires, en veillant à sélectionner les lignes distinctes

named_scope :with_comments, :joins => :comments, :select => 'DISTINCT posts.*' 
+0

semble génial. Comment puis-je transmettre des arguments me permettant d'entrer manuellement les noms d'attribut. ma table posts a un pk appelé postid et la table des commentaires a un fk appelé post_id. Je sais comment définir manuellement les pks et les fks dans les associations, comment le faire avec named_scope? merci encore, c'est vraiment une réponse de qualité. – user94154

+0

Remplacez simplement l'option: joins par la jointure souhaitée. Vous voulez probablement quelque chose comme ce qui suit, : jointures => 'INNER JOIN' commentaires "ON comments.post_id = posts.postid ' – slillibri

+0

Dans Rails,': joins' par défaut utilise' INNER JOIN' –

Questions connexes