我在模型中使用acts_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 :(得分: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
答案 1 :(得分: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])
你需要更新groups.id = X部分,因为我不确定你是如何抓取group_id的。
标签是插件提供的一个类,手动提供这样的sql为您提供了世界上所有的灵活性。