2010-06-09 4 views
0

Я использую act_as_taggable_on в модели и пытаюсь реализовать плагин auto_complete. Кажется, что все правильно подключено, но поиск не возвращает никаких результатов. Вот то, что я до сих пор:actions_as_taggable_on и auto_complete, не возвращая результатов

По мнению:

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

В контроллере:

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 

Регистратор постоянно возвращается 0 тегов, и ничего не отображается в окне просмотра (да, макет включает значения javascript по умолчанию). SQL, который генерируется, выглядит так:

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 

Любые мысли или советы были бы замечательными.

+0

Оказывается, этот вопрос был конфликт с vestal_versions, который также имеет модель тегов. есть вилка, что кто-то из vestal_versions исправит это: http://github.com/dfurber/vestal_versions/commit/61d786c9371d835b03a23c28cfb9e03322832863 –

ответ

0

Я столкнулся с этой проблемой, и только в конечном итоге писать свой собственный SQL, ваш может выглядеть примерно так:

@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]) 

Youll нужно обновить groups.id = X часть, так как я не уверен, как вы захватываете group_id.

Тег - это класс, который предоставляет плагин, предоставляя вручную sql, как это дает вам всю гибкость в мире.

1

Вы также можете создать подобный запрос с использованием 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 

Это создает следующий SQL:

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%') 

AATO версия 2.0.6

Смежные вопросы