使用高级搜索的逗号分隔字符串

comma separated string with Advance Search

我已经使用此 tutorial 在我的图书应用程序中添加了高级搜索。一切正常,但现在我正试图通过标签找到一本书。

如果用户在 :keywords text_field 中输入一个标签,我就可以使用高级搜索。

有没有办法通过用逗号分隔关键字字符串来搜索各种标签?

(ex: fun, kid stories, action) 
Would allow me to search books with fun OR kids stories OR actions.

如何通过逗号分隔的字符串搜索多个标签?

注意:我创建了一个我认为可以提供帮助的搜索方法,但我不确定如何将它与单个关键字搜索结合起来。

型号

class Book < ActiveRecord::Base

  has_many :book_mappings
  has_many :tags, through: :book_mappings

end


class BookMapping < ActiveRecord::Base
  belongs_to :book
  belongs_to :tag
end

class Tag < ActiveRecord::Base

  has_many :book_mappings
  has_many :books, through: :book_mappings

end


class Search < ActiveRecord::Base

  def books
    @books ||= find_books
  end

  def find_books
    books = Book.order(:name)

    ###This works for a single word but NOT if I have multiple tags separated by commas
    books = books.joins(:tags).where("tags.name like ?", "%#{keywords}%") if keywords.present?

    books
  end

  def search(keywords)
     return [] if keywords.blank?
     cond_text = keywords.split(', ').map{|w| "name LIKE ? "}.join(" OR ")    
     cond_values = keywords.split(', ').map{|w| "%#{w}%"}
     all(:conditions =>  (keywords ? [cond_text, *cond_values] : []))
  end

end

浏览量

<%= form_for @search do |f| %>

  <div class="field">
    <%= f.label :keywords %><br />
    <%= f.text_field :keywords %>
  </div>

<% end %>

这是一个简单的解决方案。只需为每个关键字添加一个 like 语句。

过滤带有所有标签的图书

if keywords.present?
  books = books.joins(:tags)
  keywords.tr(' ','').split(',').each do |keyword|
    books = books.where("tags.name like ?", "%#{keyword}%") 
  end
end

过滤带有任何标签的图书

if keywords.present?
  books = books.joins(:tags)

  keyword_names = keywords.split(', ')
  cond_text = keyword_names.map{|w| "tags.name like ?"}.join(" OR ")
  cond_values = keyword_names.map{|w| "%#{w}%"}

  books = books.where(cond_text, *cond_values)
end