2010-12-15 104 views
0

J'utilise acts-as-taggable sur. Deux modèles: utilisateur et messages.Comment puis-je voir des balises pour tous les utilisateurs d'une instance de modèle?

Posts belongs_to :user 
User has_many :posts 

Messages act-as-taggable. Utilisateurs agit-comme-tagueur

Tout cela est simple et fonctionne. Cependant, j'ai un cas d'utilisation qui peut être en dehors de la façon dont ce plugin fonctionne.

Je veux que les posts puissent être étiquetés par plusieurs utilisateurs. Lorsqu'un tag est créé sur un poste d'un utilisateur, il ne montre pas lorsque vous effectuez les opérations suivantes:

p = Post.first 
p.tag_list # this returns [] 

Si vous regardez le SQL généré, il sélectionne des enregistrements où « tagger_id » est NULL. Le tagger_id est, bien sûr, le user_id dans ce cas et n'est pas vraiment NULL.

Si vous y rentrez, vous pouvez obtenir ce que vous voulez.

p = Post.find(1) # get a post to work with 
p.tags_from(p.user) # returns an array of the tags: ['cats','dogs','wildebeasts'] 

Cela fonctionne.

Maintenant, le problème est que je veux qu'un autre utilisateur puisse venir et ajouter une étiquette à la publication. Peut-être que cet utilisateur pensera que c'est utile. Supposons simplement qu'il est logique de le faire. Peut-être un modérateur ... peu importe.

Compte tenu de ce qui précède, comment aurais-je une liste de tous les tags sur un post donné en supposant que plus d'un utilisateur a ajouté des tags?

Soulagée,

NJ

Répondre

4

Je ne sais pas quoi que ce soit sur le plug-in que vous avez spécifié et je suis encore à apprendre Rails. Mais je ne pense pas

p = Post.tag_list 

serait ce que vous voulez, de toute façon. Vous demandez un taglist de la classe Post plutôt que la liste des tags d'un post particulier. Par exemple, si les utilisateurs ont des colonnes « email » et « nom », vous aussi ne pouvait pas faire:

u = User.names 
u = User.emails 

Il ne fait pas vraiment de sens. Mais vous pourriez faire quelque chose comme:

User.column_names 
#=> ["id", "email", "hashed_password", "created_at", "updated_at"] 

Parce que c'est une méthode de classe. Maintenant, peut-être que tag_list est une méthode de classe, mais on dirait qu'il est utilisé pour trouver des balises orphelines ou quelque chose en raison de la façon dont il cherche null tag_givers.

Mais depuis que je suis encore nouveau pour Rails et je ne sais pas aussi comment votre plugin fonctionne, voici quelques choses que vous pouvez essayer du haut de ma tête:

p = Post.find(1) 
p.tag_list # p.column_name_of_the_column_that_holds_the_tags should work 
# or, maybe pass in ALL users as an array 
p.tags_from(User.all) 

Lemme savoir ce que les faire.

+0

Merci pour la réponse, mais une partie de ceci est particulière à ce plugin qui n'est pas très bien documenté et je n'en ai pas beaucoup pour creuser dans la source pour comprendre les choses. Pas encore de toute façon. :) –

+0

Je pense que j'ai écrit trop. Avez-vous essayé mes suggestions dans mon dernier bloc de code? – danneu

+0

Ne vous inquiétez pas d'écrire trop si vous êtes sur le sujet; désolé, je n'ai pas remarqué mon duplication de votre réponse. La seule chose que je dirais est d'éditer et de faire du p une variable d'instance @p sinon elle ne serait pas disponible pour la vue. – mark

0

Peut-être que je manque quelque chose, mais:

p = Post.tag_list # this returns [] 

#should be 
#... 
@post.find params[:id] 
#...  
@post.tag_list 

Vous appelez actuellement liste_balise la classe de poste, plutôt que d'une instance.

+0

Vous avez peut-être raison. Je vais vérifier cela plus tard et revenir à vous. Merci! –

+0

Essayez-le et faites le nous savoir. S'il vous plaît accepter la réponse de Dobry Den sur le mien si c'est le problème. – mark