Поиск с помощью acts_as_taggable_on

#ruby-on-rails #ruby-on-rails-3 #acts-as-taggable-on

#ruby-on-rails #ruby-on-rails-3 #действует как помечаемый

Вопрос:

Я пытаюсь выполнить поиск по модели для всех записей с определенным тегом.

Пример вывода, который мы пытаемся выполнить:

 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] это, например, «refere» или «ences»?

Модель вопроса

 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
  

После ввода ‘travel’ в форму:

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. не могли бы вы показать нам свою модель вопроса? И почему у вас есть теги или столбец тегов в вашей таблице вопросов?

2. @nash — Конечно, я опубликую модель вопроса. У меня есть теги в таблице вопросов, потому что я хочу, чтобы вопросы были помечены, согласно примеру на github.com/mbleigh/acts-as-taggable-on , где пользовательская таблица помечена тремя полями.

Ответ №1:

Вместо этого вы могли бы разрешить вашему параметру выполнять поиск в любой части тега.

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

Комментарии:

1. действие контроллера (и, следовательно, запрос) не задано мной — оно генерируется автоматически acts_as_taggable_on. Как я могу изменить запрос, который он автоматически генерирует, в соответствии с тем, что вы предложили?

2. Сначала вы можете использовать acts_as_taggable вместо acts_as_taggable_on :tags . И что вы имеете в виду, сгенерированный автоматически acts_as_taggable_on ? Насколько я знаю, acts_as_taggable_on может генерировать только миграцию. Во-вторых, вам следует использовать "%#{params[:term]}#" вместо "%#{params[:term]}" , если вы хотите найти что-то вроде «refere». И в вашем контроллере передайте найденные вопросы в поле зрения format.json => @tags

Ответ №2:

Принятый ответ больше не работает.

Текущее решение таково:

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

Комментарии:

1. Проверено в версии 4.0.0 actsastaggable_on: github.com/mbleigh/acts-as-taggable-on#finding-tagged-objects