2010-11-19 3 views
4
User 
has_many :posts 
has_many :post_tags, :through => :posts 

PostTag 
belong_to :post 
belongs_to :tag 
scope :distincttag, :select => ('distinct post_tags.tag_id') 

avec Rails 3.0.4, je reçois SQL invalide: SELECT post_tags *, tag_id distinct ...rails - à l'aide: sélectionnez (distincte) avec: has_many: par association produit SQL non valide

à. au moins une autre personne a connu le même problème: http://www.ruby-forum.com/topic/484938

fonctionnalité ou un bug?

grâce

+0

OK, jamais l'esprit, il ne fonctionne . En d'autres termes, créer une portée sous PostTag fonctionne. Ce qui ne marche pas, cependant, c'est de chaîner un ".select": someuser.post_tags.select ('distinct tag_id') entraînera l'erreur ci-dessus. Ne pas "select" remplacer le select implicite dans la jointure/association? – avioing

+0

'@ user.post_tags.uniq.pluck (: tag_id)' pourrait vous obtenir ce que vous voulez – bdares

Répondre

3

ne ressemble pas à la bonne chose à mettre sur une portée.

Peut-être que vous essayez d'accomplir ceci:

class PostTag < ... 
    belong_to :post 
    belongs_to :tag 
    def distincttag 
    find(:all, :select => 'distinct tag_id') 
    end 
end 

Edit: maintenant que je sais ce que vous avez besoin:

User 
has_many :posts 
has_many :post_tags, :through => :posts, :select => 'distinct tags.*' 
# or, if you are not worried about database overhead: 
has_many :post_tags, :through => :posts, :uniq => true 

Référence: http://blog.hasmanythrough.com/2006/5/6/through-gets-uniq

+0

Désolé, je ne pense pas que j'étais très clair. L'objectif est d'obtenir la liste des tags distincts pour un utilisateur. Ajouter une méthode à PostTag ne fonctionnera pas une fois que vous l'aurez chaîné à un utilisateur: someuser.post_tags.distincttag - entraînera une erreur, car post_tags est un tableau – avioing

+0

Maintenant je vois ... J'ai édité ma réponse. –

+0

Fabio, merci, mais malheureusement ça ne marchera pas. Votre premier exemple modifié utilise ": select => 'tags distincts. *', Mais le tableau" tags. * "Ne fait même pas partie de la jointure. Le second exemple, utilisant" uniq ", ne fonctionnera pas car vous utilisez "uniq" sur tout l'enregistrement "post_tags" (post_id, tag_id), alors que je veux des "tags" uniques (juste tag_id), pas des "post_tags" uniques. – avioing

Questions connexes