2011-04-16 73 views
4

我正在試圖通過模型搜索具有特定標記的所有記錄。使用acts_as_taggable_on搜索

樣本輸出,我們正在努力探索:

ruby-1.9.2-p0 :1 > Question.last.tags 
=> [#<ActsAsTaggableOn::Tag id: 2, name: "preferences">, #<ActsAsTaggableOn::Tag id: 13, name: "travel">] 

所以,Question具有tags如喜好和旅行。我想:

@tags = @questions.where("tags LIKE ?", "%#{params[:tags]}%") 
=> [] 

@tags = @questions.where("tag LIKE ?", "%#{params[:tags]}%") 
=> [] 

@tags = @questions.where("tag_list LIKE ?", "%#{params[:tags]}%") 
=> BadFieldError: Unknown column 'tag_list' 

我怎樣才能返回頂部記錄時params[:tags]例如,「參考,」或「分配辦法」?

問題模型

class Question < ActiveRecord::Base 
    has_many ... 
    acts_as_taggable_on :tags 
end 

第二次嘗試

我剛剛創建一個自定義的控制器動作,試圖更改查詢按@Nash的建議。我該如何糾正它?

def autocomplete_question_tags 
    @tags = Question.tagged_with("%#{params[:term]}", :any => true) 
    respond_to do |format| 
     format.json 
    end 
end 

在進入 '旅行' 到窗體:

Started GET "/answers/autocomplete_question_tags?term=travel" for 127.0.0.1 at 2011-04-16 20:37:34 -0400
Processing by AnswersController#autocomplete_question_tags as JSON
Parameters: {"term"=>"travel"}
{"term"=>"travel", "action"=>"autocomplete_question_tags", "controller"=>"answers"}
SQL (1.8ms) SHOW TABLES
SQL (0.8ms) SELECT COUNT(*) AS count_id FROM (SELECT 1 FROM 'questions' WHERE (questions.id IN (SELECT taggings.taggable_id FROM taggings JOIN tags ON taggings.tag_id = tags.id AND (tags.name LIKE '%travel') WHERE taggings.taggable_type = 'Question'))) AS subquery
logger.debug: 1 result in query
Completed in 114ms

ActionView::MissingTemplate (Missing template answers/autocomplete_question_tags with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml, :haml], :formats=>[:json], :locale=>[:en, :en]} in view paths "/Users/san/Documents/san/apl/app/views",
app/controllers/answers_controller.rb:36:in 'autocomplete_question_tags'

Rendered /Users/san/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.1/lib/action_dispatch/middleware/templates/rescues/missing_template.erb within rescues/layout (0.7ms)

+1

你能告訴我們你的問題的模型?爲什麼你的問題表中有標籤或標籤欄? – 2011-04-16 14:12:37

+0

@nash - 好的,我會發布問題模型。我在問題表中標記標籤,因爲我想根據https://github.com/mbleigh/acts-as-taggable-on上的示例標記問題,其中用戶表在三個字段上標記。 – sscirrus 2011-04-16 21:51:55

回答

4

你可以讓你的參數來搜索標籤的任何部分來代替。

Question.tagged_with("%#{params[:tags]}%", :any => true) 
+0

控制器操作(因此查詢)不是由我指定的 - 它由acts_as_taggable_on自動生成。我怎樣才能修改它自動生成的查詢,並按照你的建議? – sscirrus 2011-04-16 23:39:27

+0

首先,您可以使用'acts_as_taggable'而不是'acts_as_taggable_on:tags'。那麼yo是什麼意思由'acts_as_taggable_on'自動生成的?據我所知,'acts_as_taggable_on'只能生成遷移。其次,如果你想找到類似「refere」的東西,你應該使用'「%#{params [:term]}#」'而不是'「%#{params [:term]}」'。並在你的控制器傳遞你發現的問題到'format.json => @ tags' – 2011-04-17 07:32:04

1

接受的答案不再有效。

目前的解決方案是:

Question.tagged_with(params[:tags], wild: true, any: true) 
+0

不再適用於哪個版本的Rails? – sscirrus 2017-01-09 20:32:45

+0

使用ActsAsTaggableOn的4.0.0版進行檢查:https://github.com/mbleigh/acts-as-taggable-on#finding-tagged-objects – Juampi 2017-01-09 20:39:14

+0

非常感謝! – sscirrus 2017-01-09 20:40:06