0

モデルで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

どんな考えやアドバイスも素晴らしいでしょう。

4

2 に答える 2

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

于 2011-05-09T16:21:29.660 に答える
0

私はこの問題に遭遇し、自分のSQLを作成することになりました。あなたの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])

group_idをどのように取得しているかわからないため、groups.id=Xの部分を更新する必要があります。

タグはプラグインが提供するクラスであり、このようなSQLを手動で提供することで、世界中のすべての柔軟性が得られます。

于 2010-06-09T14:56:37.257 に答える