2010-06-09 5 views
0

J'utilise acts_as_taggable_on dans un modèle, et j'essaie d'implémenter le plugin auto_complete. Il semble que j'ai tout correctement connecté, mais la recherche ne retourne aucun résultat. Voici ce que j'ai jusqu'à présent:acts_as_taggable_on et auto_complete ne renvoyant aucun résultat

De l'avis:

<%= text_field_with_auto_complete(:link, :tag_list, {}, {:tokens => ','}) %> 

Dans le contrôleur:

def auto_complete_for_link_tag_list 
    @tags = Link.tag_counts_on(:tags).where('tags.name LIKE ?', params[:link][:tag_list]) 
    render :inline => "<%= auto_complete_result(@tags, 'name') %>", :layout => false 
    logger.info "#{@tags.size} tags found." 
    end 

L'enregistreur revient sans cesse 0 balises, et rien ne montre dans la vue (ouais, la mise en page inclut les valeurs par défaut de javascript). Le code SQL généré est le suivant:

SELECT tags.*, COUNT(*) AS count FROM "tags" LEFT OUTER JOIN taggings ON tags.id = taggings.tag_id AND taggings.context = 'tags' INNER JOIN links ON links.id = taggings.taggable_id WHERE (((tags.name LIKE 'so') AND (taggings.taggable_type = 'Link'))) GROUP BY tags.id, tags.name HAVING COUNT(*) > 0 

Des idées ou des conseils seraient fantastiques.

+0

Il se trouve la question était un conflit avec vestal_versions, qui a également un modèle de balises. il y a une fourchette que quelqu'un a fait de vestal_versions pour résoudre ce problème: http://github.com/dfurber/vestal_versions/commit/61d786c9371d835b03a23c28cfb9e03322832863 –

Répondre

0

je suis tombé sur ce problème et vient de se terminer par écrire mon propre SQL, le vôtre peut ressembler à ceci:

@tags = Tag.find_by_sql("SELECT tags.name, tags.id 
FROM tags JOIN taggings ON tags.id = taggings.tag_id 
JOIN links ON taggings.taggable_id = links.id 
JOIN groups ON links.group_id = groups.id 
WHERE groups.id = X 
AND tags.name LIKE '%?%'",params[:link][:tag_list]) 

Vous aurez besoin de mettre à jour la partie groups.id = X, comme je ne suis pas sûr comment vous attrapez le group_id.

Tag est une classe que le plugin fournit, fournissant manuellement sql comme cela vous donne toute la flexibilité dans le monde.

1

Vous pouvez également créer une requête similaire en utilisant ActiveRecord

def self.tagged_like(term) 
    conditions = ["taggings.taggable_type = 'Link' AND LOWER(tags.name) LIKE ?", 
       "%#{term.downcase}%"] 

    ActsAsTaggableOn::Tag.find(:all, 
           :include => "taggings", 
           :conditions => conditions) 
end 

Cela génère l'instruction SQL suivante:

SELECT [..fields..] FROM "tags" LEFT OUTER JOIN "taggings" ON taggings.tag_id = tags.id 
WHERE (taggings.taggable_type = 'Link' AND LOWER(tags.name) LIKE '%something%') 

version 2.0.6 AATO

Questions connexes