2011-03-22 5 views
3

J'ai donc essayé de chercher un exemple de la façon de procéder, et je ne suis même pas sûr de savoir comment décrire ce que j'essaie de faire. Je suis un Noob absolu quand il s'agit de SQL, et je suis sûr que c'est vraiment basique mais je suis totalement perdu:Rails: Trouver par attribut associé au modèle?

J'ai un modèle, Photo qui has_many :tags, :through => :taggings. Les tags ont un nom et un identifiant.

Je veux faire quelque chose comme: Photo.where(#tag_name in [array])

... mais comme je l'ai dit je ne sais pas comment écrire quelque chose comme ça, ou quoi chercher pour voir un exemple sur Google. Est-ce que quelqu'un peut me donner un exemple de ce genre de requête, et comment pourrait-elle être appelée?

Merci!

Répondre

1

Alors, comme une torsion sur la méthode de Brett, il se les travaux suivants sans PostgreSQL rupture:

def self.tagged_with(string) 
    array = string.split(',').map{ |s| s.lstrip } 
    select('distinct photos.*').joins(:tags).where('tags.name' => array) 
end 

Problème résolu! Voir this article pour une excellente explication de pourquoi c'est une meilleure idée que «groupe».

+5

Deux downvotes sans commentaires ?? Pas très utile. – Andrew

+0

Attention: Le lien de l'article redirige maintenant vers une page publicitaire: http://www.awesomeful.net/ – theUtherSide

9

Juste essayé cela sur un modèle similaire de mon propre et semblait bien fonctionner:

Photo.joins(:tags).where('tags.name' => ['herp','derp']).group(:id) 

Aussi, voici une excellente ressource sur le AREL querying interface rails 3 uses, avec des informations sur ces questions et d'autres ActiveRecord appels liés à l'interrogation.

+0

Impressionnant. Deux questions: 1- Ce type de requête a-t-il un nom? 2- Que fait .group (: id)? – Andrew

+0

Il s'agit d'une jointure interne (activeRecord détermine comment joindre automatiquement la table des marquages ​​car vous utilisez 'has_many: through') sur les balises, la clause where détermine les enregistrements à renvoyer. Dans ma base de données locale, une photo peut avoir plusieurs tags. Si une photo est étiquetée 'herp' et aussi' derp' alors cette requête (sans '.group') retournera deux copies identiques de la même photo (car elle correspond deux fois). Grouper par id regroupe les résultats de façon unique en fonction de id - qui, puisque vous interrogez sur Photo, suppose l'identifiant de la table photo. –

+0

Super, merci pour l'aide! – Andrew

Questions connexes